1.简单工厂模式:
需要由以下角色组成:
1.接口2.接口的实现类(简单工厂模式里面的具体产品角色)
3.工厂类
简单工厂模式就是把创建对象的方法封装起来. 简单工厂模式是类的创建模式,又叫做静态工厂方法。简单工厂模式就是由一个工厂类根据传入的参量决定创建出哪一种产品类的实例。 简单工厂模式涉及到工厂角色、抽象产品角色以及具体产品角色等三个角色: 1.工厂类(Creator)角色:担任这个角色的是工厂方法模式的核心,含有与应用紧密相关的商业逻辑。工厂类在客户端的直接调用下创建产品对象,它往往由一个具体JAVA类实现。 2.抽象产品(Produce)角色:担任这个角色的类是由工厂方法模式所创建的对象的父类,或它们共同拥有的接口。抽象产品角色可以用一个JAVA接口或者JAVA抽象类实现。3.具体产品(ConcreteProduct)角色:工厂方法模式所创建的任何对象都是这个角色的实例,具体产品角色由一个具体JAVA类实现。简单工厂模式的优点:模式的核心是工厂类。这个类含有必要的判断逻辑,可以决定在什么时候创建哪一个产品类的实例。而客户端则可以免除直接创建产品对象的责任,而仅仅负责“消费”产品。简单工厂模式通过这种做法实现了对责任的分割。 简单工厂模式的缺点:当产品类有复杂的多层次等级结构时,工厂类只有它自己。以不变应万变,就是模式的缺点。当产品类有不同的接口种类时,工厂类需要判断在什么时候创建某种产品。这种对时机的判断和对哪一种具体产品的判断逻辑混合在一起,使得系统在将来进行功能扩展时较为困难(这一缺点在工厂方法模式中得到克服)。另外,由于简单工厂模式使用静态方法作为工厂方法(并不需要工厂类),而静态方法无法由子类继承,因此,工厂角色无法形成基于继承的等级结构。(这一缺点也会在工厂方法模式中得到克服。)2.策略模式 策略模式,又叫算法簇模式,就是定义了不同的算法族,并且之间可以互相替换,此模式让算法的变化 独立于使用算法的客户。 策略模式的好处是:在于你可以动态的改变对象的行为。 设计原则是把一个类中经常改变或者将来可能改变的部分提取出来,作为一个接口(c++z中可以用虚类),然后在类中 包含这个对象的实例,这样类的实例在运行时就可以随意调用实现了这个接口的类的行为. 策略模式中有三个对象: (1)环境对象:该类中实现了对抽象策略中定义的接口或者抽象类的引用。 (2)抽象策略对象:它可由接口或抽象类来实现。 (3)具体策略对象:它封装了实现同不功能的不同算法。 利用策略模式构建应用程序,可以根据用户配置等内容,选择不同有算法来实现应用程序的功能。具体的选择有环境对 象来完成。采用这种方式可以避免由于使用条件语句而带来的代码混乱,提高应用程序的灵活性与条理性。
- //工厂Creator类
- public
class Creator - {
- /**
* 静态工厂方法 */ public static Product factory() { return new ConcreteProduct(); } - }
- //抽象角色Product接口
- public
interface Product - {
- //可以为空接口
- }
- //具体产品角色ConcreteProduct类
- public
class ConcreteProduct implements Product - {
- public
ConcreteProduct(){} - }
- /**
- *
- * @author trygf521@126.com:阿福
- * 首先定义一个策略接口,这是诸葛亮老人家给赵云的三个锦囊妙计的接口。
- */
- public interface IStrategy {
- //每个锦囊妙计都是一个可执行的算法。
- public void operate();
- }
- /**
- *
- * @author trygf521@126.com:阿福
- * 找乔国老帮忙,使孙权不能杀刘备。
- */
- public class BackDoor implements IStrategy {
- @Override
- public void operate() {
- System.out.println("找乔国老帮忙,让吴国太给孙权施加压力,使孙权不能杀刘备...");
- }
- }
- /**
- *
- * @author trygf521@126.com:阿福
- * 求吴国太开个绿灯。
- */
- public class GivenGreenLight implements IStrategy {
- @Override
- public void operate() {
- System.out.println("求吴国太开个绿灯,放行!");
- }
- }
- /**
- *
- * @author trygf521@126.com:阿福
- * 孙夫人断后,挡住追兵。
- */
- public class BlackEnemy implements IStrategy {
- @Override
- public void operate() {
- System.out.println("孙夫人断后,挡住追兵...");
- }
- }
- /**
- *
- * @author trygf521@126.com:阿福
- *
- */
- public class Context {
- private IStrategy strategy;
- //构造函数,要你使用哪个妙计
- public Context(IStrategy strategy){
- this.strategy = strategy;
- }
- public void operate(){
- this.strategy.operate();
- }
- }
- public class ZhaoYun {
- /**
- * 赵云出场了,他根据诸葛亮给他的交代,依次拆开妙计
- */
- public static void main(String[] args) {
- Context context;
- //刚到吴国的时候拆开第一个
- System.out.println("----------刚刚到吴国的时候拆开第一个---------------");
- context = new Context(new BackDoor());
- context.operate();//拆开执行
- System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
- //当刘备乐不思蜀时,拆开第二个
- System.out.println("----------刘备乐不思蜀,拆第二个了---------------");
- context = new Context(new GivenGreenLight());
- context.operate();//拆开执行
- System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
- //孙权的小追兵了,咋办?拆开第三个锦囊
- System.out.println("----------孙权的小追兵了,咋办?拆开第三个锦囊---------------");
- context = new Context(new BlackEnemy());
- context.operate();//拆开执行
- System.out.println("\n\n\n\n\n\n\n\n\n\n\n\n\n");
- }
- }