zoukankan      html  css  js  c++  java
  • [置顶] 设计模式系列4-抽象工厂模式

    
    

    设计模式系列4-抽象工厂模式

     

    前言:

    前一节讲了单例模式,这节我们讲23种设计模式之抽象工厂模式。
     
     

    什么是抽象工厂模式?

    1.抽象工厂模式:提供一个创建一系列相关或相互依赖对象的接口,而无需指定它们具体的类。(最初的定义出现于《设计模式》(Addison-Wesley, 1994)).
    2.抽象工厂与工厂方法:抽象工厂与工厂方法模式在许多方面都非常相似。很多人常常搞不清楚应该在什么时候用哪一个,两个模式都用于相同的目的:创建对象而不让客户端知晓返回了什么确切的具体对象。
    抽象工厂 工厂方法
    通过对象组合创建抽象产品 通过类继承创建抽象产品
    创建多系列产品 创建一种产品
    必须修改父类的接口才能支持新的产品 子类化创建者并重载工厂方法以创建新产品
    3.软件设计的黄金法则:变动需要抽象。
     

     

    何时使用抽象工厂模式?

    1:如果希望一个系统独立于它的产品的创建,组合和表示的时候,换句话说,希望一个系统只是知道产品的接口,而不关心实现的时候
    2:如果一个系统要由多个产品系列中的一个来配置的时候,换句话说,就是可以动态的切换产品簇的时候
    3:如果要强调一系列相关产品的接口,以便联合使用它们的时候

     

    抽象工厂的实现:

    1.抽象工厂在Java中的实现
    1.抽象产品类A的实现:
    public abstract class AbstractProductA {	
    	//每个产品共有的方法
    	public void sharedMethod() {
    		
    	}
    	
    	//每个产品相同方法,不同实现
    	public abstract void doSomething();
    }
    
    2.抽象产品类B的实现:
    public abstract class AbstractProductB {
    	//每个产品共有的方法
    	public void sharedMethod() {
    		
    	}
    	
    	//每个产品相同方法,不同实现
    	public abstract void doSomething();
    }
    
    3.具体产品类A1的实现:
    public class ProductA1 extends AbstractProductA {
    	public void doSomething() {
    		System.out.println("产品A1的实现方法");
    	}
    }
    
    4.具体产品类A2的实现
    public class ProductA2 extends AbstractProductA {
    	
    	public void doSomething() {
    		System.out.println("产品A2的实现方法");
    	}
    }
    
    5.具体产品类B1,B2的实现同A1,A2
    
    6.抽象工厂类的实现:(抽象工厂AbstractFactory类定义了每个具体工厂要实现的功能,此抽象工厂定义了两个产品家族的产品创建方法)
    public abstract class AbstractFactory {
    	
    	//创建A产品家族
    	public abstract AbstractProductA createProductA();
    	
    	//创建B产品家族
    	public abstract AbstractProductB createProductB();
    }
    注:有N个产品家族,在抽象工厂中就有N个创建方法
    
    7.创建产品则是由具体工厂实现的
    等级1产品的实现:
    public class Factory1 extends AbstractFactory {
    	//只生产产品等级为1的A产品
    	@Override
    	public AbstractProductA createProductA() {
    		return new ProductA1();
    	}
    
    	//只生产产品等级为1的B产品
    	@Override
    	public AbstractProductB createProductB() {
    		return new ProductB1();
    	}
    }
    
    等级2产品的实现:
    public class Factory2 extends AbstractFactory {
    
    	//只生产产品等级为2的A产品
    	@Override
    	public AbstractProductA createProductA() {
    		return new ProductA2();
    	}
    
    	//只生产产品等级为2的B产品
    	@Override
    	public AbstractProductB createProductB() {
    		return new ProductB2();
    	}
    }
    
    8.具体的调用:
    //定义出两个工厂
    AbstractFactory creator1 = new Factory1();
    AbstractFactory creator2 = new Factory2();
    		 
    //产生A1对象
    AbstractProductA a1 = creator1.createProductA();
    		 
    //产生A2对象
    AbstractProductA a2 = creator2.createProductA();
    		 
    //产生B1对象
    AbstractProductB b1 = creator1.createProductB();
    		 
    //产生B2对象
    AbstractProductB b2 = creator2.createProductB();


  • 相关阅读:
    第七章 路由 68 路由-前端路由和后端路由的概念
    第六章 组件 67 使用ref获取DOM元素和组件引用
    第六章 组件 65-66 组件案例-发表评论功能的实现
    第六章 组件 63 组件传值-父组件向子组件传值和data与props的区别
    第六章 组件 62 组件-组件定义方式的复习
    第六章 组件 61 动画-小球动画flag标识符的作用分析
    第六章 组件 60 组件切换-应用切换动画和mode方式
    第六章 组件 59 组件切换-使用Vue提供的component元素实现组件切换
    vscode代码格式化 空格的配置
    vim配置C++开发环境 win10
  • 原文地址:https://www.cnblogs.com/pangblog/p/3359950.html
Copyright © 2011-2022 走看看