代理设计模式、工厂设计模式、单例设计模式



代理设计模式:

可以先简单理解为代理商的概念,比如汽车工厂他们只负责生产汽车而通常的4S店就负责销售这些汽车,他们就是代理销售。

 

典型的代理设计模式:proxy不是真正的服务提供者,它只是负责中间一些验证之类的事情。它们都需要实现同一个接口。

  

工厂设计模式:

1.简单工厂模式(也称静态方法工厂模式)

  静态方法工厂模式:

  (工厂创建水果的例子:FruitFactory、工厂根据传入的字符串参数来判断生成哪种水果)

工厂角色:负责实现创建所有实例的内部逻辑,工厂类可以被外界直接调用,创建所需的产品

抽象产品角色:简单工厂模式所创建的所有对象的父类。它负责描述所有实例所有共有的公共接口

具体产品角色:所有创建的对象都是充当这个角色的某个具体类的实例

 

优势和缺陷:

在简单工厂模式中,工厂类是整个模式的关键所在。它包含必要的判断逻辑,能够根据外界的信息,决定究竟应该创建那个具体类的对象。通过使用工厂类,外界可以从直接创建具体产品对象的尴尬局面中摆脱出来,仅仅需要负责“消费”对象就可以了,而不必管这些对象究竟是如何创建以及如何组织的。这样就明确区分了各自的职责和权力,有利于整个软件体系结构的优化。

 

应用情景

1.工厂类负责创建的对象比较少

2.客户只知道传入工厂类的参数,对于如何创建对象逻辑不关心

 

2.工厂方法模式

  在简单工厂模式中,一个工厂类处于对产品类进行实例化的中心位置。它知道每一个产品的细节,并决定何时是哪一个产品类的实例化。简单工厂模式的优点是能够使客户端独立于产品的创建过程,并且在系统中引入新产品时无需对客户端进行修改,缺点是当一个新产品要加入到系统中的时候,必须修改工厂类,以加入必要的处理逻辑。简单工厂模式的致命弱点就是出于核心地位的工厂类,因为一旦它无法确定要对那个类进行实例化,就无法使用该模式。而工厂方法模式则可以很好的解决这一个问题。

 

产品角色Product):定义产品接口

真实产品(ConcreteProduct):实现接口Product的类

工厂角色Creator:声明工厂方法,返回一个产品

真实的工厂ConcreteCreator:实现工厂方法,有客户调用,放回一个产品的实例

 

 

基于工厂角色和产品角色的多态性设计是工厂方法模式的关键。她能够是工厂可以自主确定创建何种产品对象,二如何创建这个对象的细节则完全封装在具体工厂内部。使用工厂方法模式的另一个优点在于系统在加入新产品的时候无需修改抽象工厂类和抽象产品提供的接口,无需修改客户端,也无需修改其他的具体工厂和具体产品,而是只要添加一个具体工厂和具体产品就可以了,这样,系统的可扩展性非常好。


从上面创建产品对象的代码可以看出,工厂方法简单工厂的主要区别是,简单工厂是把创建产品的职能都放在一个类里面,而工厂方法则把不同的产品放在实现了工厂接口的不同工厂类里面,这样就算其中一个工厂类出了问题,其他工厂类也能正常工作,互相不受影响,以后增加新产品,也只需要新增一个实现工厂接口工厂类,就能达到,不用修改已有的代码。但工厂方法也有他局限的地方,那就是当面对的产品有复杂的等级结构的时候,例如,工厂除了生产家电外产品,还生产手机产品,这样一来家电是手机就是两大产品家族了,这两大家族下面包含了数量众多的产品,每个产品又有多个型号,这样就形成了一个复杂的产品树了。如果用工厂方法来设计这个产品家族系统,就必须为每个型号的产品创建一个对应的工厂类,当有数百种甚至上千种产品的时候,也必须要有对应的上百成千个工厂类,这就出现了传说的类爆炸,对于以后的维护来说,简直就是一场灾难.....

 

应用场景:

1.类不知道自己要创建哪一个对象

2.类用她的子类来指定创建那个对象

3.客户需要清楚创建了哪一个对象

 

3.抽象工厂设计模式

抽象工厂模式与工厂方法模式的最大区别在于:工厂方法模式针对的是一个产品等级结构,而抽象工厂模式则针对的是多个产品等级结构。正应为如此,抽象工厂模式中经常会用到产品族的概念(Product Family)这一概念,它是指位于不同的产品等级结构中,并且功能相互关联的产品系列。

 

抽象工厂(AbstractFactory):声明生成抽象产品的方法

具体工厂(ConcreteFactory:执行生成抽象产品的方法,生成一个具体的产品

抽象产品(AbstractProduct:为一种产品声明接口

具体产品(ConcretePorduct:定义一个具体工厂生成的具体抽象的对象,实现产品接口

 

   抽象工厂负责创建不同的有联系的多个产品,不同的抽象工厂创建的产品不同,但产品之间的关系相同。

 

   优势和缺陷:

抽象工厂的模式主要优点是隔离了具体类的生成,使得客户部需要知道什么被创建了,由于这种隔离,更换一个具体工厂就变得相对容易。所有的具体工厂都实现了抽象工厂中定义的那些公共接口,因此朱旭改变具体工厂的实例,就可以再某种程度上改变整个软件系统的行为。使用抽象工厂模式的最大好处是,当一个产品族中的多个对象被设计成一起工作时,她能保证客户端只是使用同一个产品族中的对象。抽象工厂模式的缺点是,在添加心的产品对象是,难以扩展抽象工厂一边生产心种类的产品。这是因为AbstractFactory接口中贵的那个了所有 可能被创建的产品集合,要支持新种类的产品就意味着要对该接口进行扩展,二者将涉及到AbstractFactory几去所有子类的修改,显然是有小小的不便,但不重要。

 

应用情景:

1.系统需要屏蔽有关对象如何创建、如何主旨和如何表示。

2.系统需要有关联的多个对象来构成。

3.有关的多个对象需要一起应用并且他们的约束是强迫的(不可分离的)

4.你想提供一组对象儿不显示他们的实现过程,只是显示他们的接口。

 

 

简单工厂和工厂方法模式的比较

 

工厂方法模式和简单工厂模式在定义上的不同是很明显的。工厂方法模式的核心是一个抽象工厂类,而不像简单工厂模式把核心放在一个实类(实体工厂类)上。工厂方法模式可以允许很多实的工厂类从抽象工厂类继承下来从而可以在实际上成为多个简单工厂模式的综合,从而推广了简单工厂模式。 反过来讲,简单工厂模式是由工厂方法模式退化而来。设想如果我们非常确定一个系统只需要一个实的工厂类,那么就不妨把抽象工厂类合并到实的工厂类中去。而这样一来,我们就退化到简单工厂模式了。

 

三种工厂设计模式的总结:

1)简单工厂模式是由一个具体的类去创建其他类的实例,父类是相同的,父类是具体的。 

2)工厂方法模式是有一个抽象的父类定义公共接口,子类负责生成具体的对象,这样做的目的是将类的实例化操作延迟到子类中完成。 

3)抽象工厂模式提供一个创建一系列相关或相互依赖对象的接口,而无须指定他们具体的类。它针对的是有多个产品的等级结构。而工厂方法模式针对的是一个产品的等级结构。



1)还没有工厂时代:假如还没有工业革命,如果一个客户要一款宝马车,一般的做法是客户去创建一款宝马车,然后拿来用。
    2)简单工厂模式:后来出现工业革命。用户不用去创建宝马车。因为客户有一个工厂来帮他创建宝马.想要什么车,这个工厂就可以建。比如想要320i系列车。工厂就创建这个系列的车。即工厂可以创建产品。
    3)工厂方法模式时代:为了满足客户,宝马车系列越来越多,如320i,523i,30li等系列一个工厂无法创建所有的宝马系列。于是由单独分出来多个具体的工厂。每个具体工厂创建一种系列。即具体工厂类只能创建一个具体产品。但是宝马工厂还是个抽象。你需要指定某个具体的工厂才能生产车出来。
    4)抽象工厂模式时代:随着客户的要求越来越高,宝马车必须配置空调。而且这空调必须对应给系列车才能使用。于是这个工厂开始生产宝马车和需要的空调。
         最终是客户只要对宝马的销售员说:我要523i空调车,销售员就直接给他523i空调车了。而不用自己去创建523i空调车宝马车.

 

单例设计模式:

 

想要实现单例设计模式的核心:构造器私有化、属性(public static 修饰)

实现单例设计模式有两种:懒汉式和饱汉式加载。

单例模式是一种常用的软件设计模式。在它的核心结构中只包含一个被称为单例类的特殊类。通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。如果希望在系统中某个类的对象只能存在一个,单例模式是最好的解决方案。

public class Singleton {

// 构造方法私有化是单例设计模式的核心思想

private Singleton() {

}

private static Singleton singleton;

public static Singleton getSingleton() {

return new Singleton();

}

public void dosth() {

System.out.println("实现了单例设计模式*****");

}

}

public class Singleton {

// 构造方法私有化是单例设计模式的核心思想

private Singleton() {

}

private static Singleton singleton=new Singleton();

public static Singleton getSingleton() {

return singleton;

}

public void dosth() {

System.out.println("实现了单例设计模式*****");

}

}

 

 

 

 

 

 


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值