设计模式java实现代码 设计模式java书

java 设计模式(工厂方法)

面向抽象(抽象类或接口)编程。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:申请域名虚拟主机、营销软件、网站建设、乌翠网站维护、网站推广。

IWorkFactory studentWorkFactory = new StudentWorkFactory(); 注意:类型是接口类型,即抽象工厂,抽象工厂生产的是抽象产品,而new的则是具体工厂,是由子类实现的,具体工厂生产具体产品。面向抽象的好处:1.在设计抽象的时候不用管具体的实现,只要定义接口知道它用来干什么就行,这样,我只需要知道抽象接口就能继续下面的开发设计工作了,而不用事先设计具体的实现内容;2. 可以扩展多个子类实现抽象接口,更利于系统后期的扩展,而对原系统不造成任何影响,即:开-闭原则。

TeacherWork tt = new TeacherWork(); 不用说就是面向具体实现类编程,缺点就是扩展性不好,对系统后期维护扩展影响较大。

举个简单的例子:

假如在系统的A.java中代码中使用了TeacherWork 类型对象,是满足了目前软件的需求,但是,如果有一天需求变化了需要一个StudentWork 类型对象,该怎么办?只能修改A.java类来满足这样的修改需求。这样就影响了原来系统结构稳定性,需要重新调试和测试,而这带来的维护成本是非常大的,有时可能还会带来系统错误,而影响系统运行。

如果在A.java类中应用Work接口类型就不会存在这种问题,A.java不需要任何修改,只需要修改注入到A中的Work接口的具体实现类即可。

面向抽象编程的好处就在于对系统维护和扩展上,即在不影响原系统稳定运行的基础上增加新的扩展行为,即要符合“开-闭”原则。可能会因此而失去一定的效率问题,但是对于后期的维护成本来说,这个可以忽略不计。 推荐你一本好书:《软件秘笈-设计模式那点事》其中讲解的设计模式很到位,还有每个模式的静态类图和JDK中设计模式的具体分析讲解,读了收获一定很大。祝你成功!

java设计模式 观察者模式 代码

第一个

public interface RandomNumberListener {//接口

public void numberChanged(double d);

}

第二个

public class Consol implements RandomNumberListener{

@Override

public void numberChanged(double d) {

System.out.println(d);

}

}

第三个

public class SwingWindow

extends JFrame

implements RandomNumberListener{//观察者

private JLabel label = new JLabel();

public SwingWindow(){

this.getContentPane().add( label);

this.setSize(300,200);

this.setVisible(true);

}

@Override

public void numberChanged(double d) {

label.setText(String.valueOf(d));

}

}

第四个

public class RandomNumber {//业务

private double r;

private ListRandomNumberListener listeners = new ArrayListRandomNumberListener();

//添加所有观察者

public void addRandomNumberListener(RandomNumberListener lis){

listeners.add(lis);

}

public void random(){

r = Math.random();

//数据发生改变,通知所有的观察者

for (RandomNumberListener lis : listeners) {

lis.numberChanged(r);

}

}

}

第五个

public class Test {

public static void main(String[] args) throws InterruptedException{

RandomNumber rn = new RandomNumber();

SwingWindow sw = new SwingWindow();

Consol c = new Consol();

rn.addRandomNumberListener(sw);

rn.addRandomNumberListener(c);

while(true){

rn.random();

Thread.sleep(new Random().nextInt(3000)+1000L);

}

}

}

Java设计模式,需要用到两种设计模式,急需!

工厂模式:

Product代码:

public interface Work {

void doWork();

}

ConcreteProduct代码:

public class StudentWork implements Work {

public void doWork() {

System.out.println("学生做作业!");

}

}

public class TeacherWork implements Work {

public void doWork() {

System.out.println("老师审批作业!");

}

}

Creator代码:

public interface IWorkFactory {

Work getWork();

}

ConcreteCreator代码:

public class StudentWorkFactory implements IWorkFactory {

public Work getWork() {

return new StudentWork();

}

}

public class TeacherWorkFactory implements IWorkFactory {

public Work getWork() {

return new TeacherWork();

}

}

Test代码:

public class Test {

public static void main(String[] args) {

IWorkFactory studentWorkFactory = new StudentWorkFactory();

studentWorkFactory.getWork().doWork();

IWorkFactory teacherWorkFactory = new TeacherWorkFactory();

teacherWorkFactory.getWork().doWork();

}

}

追问一下,给你写第二个。

急求java设计模式,要求用到两种设计模式 求详细代码

.饿汉式单例类

//饿汉式单例类.在类初始化时,已经自行实例化

public class Singleton1 {

//私有的默认构造子

private Singleton1() {}

//已经自行实例化

private static final Singleton1 single = new Singleton1();

//静态工厂方法

public static Singleton1 getInstance() {

return single;

}

}

2.懒汉式单例类

//懒汉式单例类.在第一次调用的时候实例化

public class Singleton2 {

//私有的默认构造子

private Singleton2() {}

//注意,这里没有final

private static Singleton2 single=null;

//静态工厂方法

public synchronized static Singleton2 getInstance() {

if (single == null) {

single = new Singleton2();

}

return single;

}

}

//对懒汉式单例的改进(错误的改进)

//实际上,只有在第一次创建对象的时候需要加锁,之后就不需要了 ,这样可以提升性能

public synchronized static Singleton2 getInstance() {

if (instance == null) {

synchronized(instance){ //锁住当前实例对象

if(instance == null){

instance = new Singleton2();

}

}

}

return instance;

}

错误原因:

aA、B线程同时进入了第一个if判断

bA首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();

c由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。

dB进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。

e此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。

正确改进(使用内部类):

JVM内部的机制能够保证当一个类被加载的时候,这个类的加载过程是线程互斥的,JVM能够帮我们保证instance只被创建一次,

并且会保证把赋值给instance的内存初始化完毕,这样我们就不用担心上面的问题。

同时该方法也只会在第一次调用的时候使用互斥机制,这样就解决了低性能问题

public?class?Singleton?{??

??

/*?私有构造方法,防止被实例化?*/??

private?Singleton(){

}

/*?此处使用一个内部类来维护单例?*/??

private?static?class?SingletonFactory?{??

private?static?Singleton?instance?=?new?Singleton();??

}

/*?获取实例?*/??

public?static?Singleton?getInstance()?{??

return?SingletonFactory.instance;??

}

/*?如果该对象被用于序列化,可以保证对象在序列化前后保持一致?*/??

public?Object?readResolve()?{??

return?getInstance();??

}

}

其实说它完美,也不一定,如果在构造函数中抛出异常,实例将永远得不到创建,也会出错????

第二种改进:

因为我们只需要在创建类的时候进行同步,所以只要将创建和getInstance()分开,

单独为创建加synchronized关键字,也是可以的

public class Singleton {

private static Singleton instance=null;

private Singleton(){}

private static synchronized void Init(){

if(instance==null)

instance=new Singletion();

}

public static Singleton getInstance(){

if(instance==null){

Init();

}

return instance;

}

}

3.登记式单例类

import java.util.HashMap;

import java.util.Map;

//登记式单例类.

//类似Spring里面的方法,将类名注册,下次从里面直接获取。

public class Singleton3 {

private static MapString,Singleton3 map = new HashMapString,Singleton3();

static{

Singleton3 single = new Singleton3();

map.put(single.getClass().getName(), single);

}

//保护的默认构造子

protected Singleton3(){}

//静态工厂方法,返还此类惟一的实例

public static Singleton3 getInstance(String name) {

if(name == null) {

name = Singleton3.class.getName();

System.out.println("name == null"+"---name="+name);

}

if(map.get(name) == null) {

try {

map.put(name, (Singleton3) Class.forName(name).newInstance());

} catch (InstantiationException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (ClassNotFoundException e) {

e.printStackTrace();

}

}

return map.get(name);

}

//一个示意性的商业方法

public String about() {

return "Hello, I am RegSingleton.";

}

public static void main(String[] args) {

Singleton3 single3 = Singleton3.getInstance(null);

System.out.println(single3.about());

}

}

当前名称:设计模式java实现代码 设计模式java书
URL网址:https://www.cdcxhl.com/article20/doscdco.html

成都网站建设公司_创新互联,为您提供网站维护微信公众号小程序开发网站制作网站内链虚拟主机

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

成都定制网站建设