zoukankan      html  css  js  c++  java
  • 设计模式:工厂模式

    參考实例:http://www.cnblogs.com/java-my-life/archive/2012/03/28/2418836.html

    抽象工厂模式的缺点

    • 不太easy扩展新的产品

      假设须要给整个产品族加入一个新的产品。那么就须要改动抽象工厂,这样就会导致改动全部的工厂实现类。

    ===================

    工厂 事实上就是抽象出事物的共性或者相似之处,定义共同的接口,实现交给详细的子类处理的过程。

    理解 产品族和等级的概念:

       1.抽象工厂:定义工厂接口。包括生产原味和草莓味的酸奶的方法。

       2.定义工厂的实现类:蒙牛工厂和伊利工厂。并实现接口的方法;

       3.抽象工厂:定义口味接口。包括原味接口和草莓味接口,每一个接口包括该口味酸奶的价格的方法。

       4.定义口味接口的实现类:每一个工厂都能生产原味和草莓味酸奶。因此每一个工厂分别包括原味接口的实现类和草莓味接口的实现类,实现类中给出该口味酸奶的价格。

       5.顾客类:顾客购买酸奶,仅仅要说明要买酸奶的厂家,既得到该厂家下不同口味酸奶的价格信息。

       代码例如以下:

    定义 草莓味接口:

    package iv.factory.feidanyi.yuanshi.interfaces;
    
    public interface CaoMeiWei {
    
    	void getPrice();
    }
    

    定义草莓味的实现类:蒙牛草莓味

    package iv.factory.feidanyi.yuanshi.classes;
    
    import iv.factory.feidanyi.yuanshi.interfaces.CaoMeiWei;
    
    public class MengNiuCmw implements CaoMeiWei {
    
    	private int price =0;
    	
    	public MengNiuCmw(int price){
    		this.price = price;
    	}
    	public void getPrice() {
    		// TODO Auto-generated method stub
    		System.out.println("蒙牛草莓味价格:"+this.price);
    	}
    
    }
    


     

    定义草莓味的实现类:伊利草莓味

    package iv.factory.feidanyi.yuanshi.classes;
    
    import iv.factory.feidanyi.yuanshi.interfaces.CaoMeiWei;
    
    public class YiLiCmw implements CaoMeiWei {
    
    	private int price =0;
    	
    	public YiLiCmw(int price){
    		this.price = price;
    	}
    	public void getPrice() {
    		// TODO Auto-generated method stub
    		System.out.println("伊利草莓味价格:"+this.price);
    	}
    
    }
    


     

    定义原味接口:

    package iv.factory.feidanyi.yuanshi.interfaces;
    
    public interface YuanWei {
    	
    	void getPrice();
    }
    


    定义原味接口的实现类:蒙牛原味:

    package iv.factory.feidanyi.yuanshi.classes;
    
    import iv.factory.feidanyi.yuanshi.interfaces.YuanWei;
    
    public class MengNiuYw implements YuanWei{
    	private short price =0;
    	private String brand ="";
    	public MengNiuYw(int price){
    		this.price = (short) price;
    	}
    	public void getPrice() {
    		// TODO Auto-generated method stub
    		System.out.println("原味价格:"+this.price);
    	}
    	public void getBrand() {
    		// TODO Auto-generated method stub
    		System.out.println("品牌:"+this.brand);
    	}
    
    }
    

    定义原味接口的实现类:伊利原味:

    package iv.factory.feidanyi.yuanshi.classes;
    
    import iv.factory.feidanyi.yuanshi.interfaces.YuanWei;
    
    public class YiLiYw implements YuanWei{
    	
    	private int price =0;
    	private String brand = "";
    	
    	public YiLiYw(int price){
    		this.price = price;
    	}
    
    	public void getPrice() {
    		// TODO Auto-generated method stub
    		System.out.println("原味价格:"+this.price);
    	}
    
    }
    


    定义厂家的接口:

    package iv.factory.feidanyi.yuanshi.interfaces;
    
    public interface AbstractFactory {
    
    	YuanWei createYuanWei();
    	CaoMeiWei createCaoMeiWei();
    }
    


    定义厂家的接口的实现类:蒙牛厂家:

    package iv.factory.feidanyi.yuanshi.classes;
    
    import iv.factory.feidanyi.yuanshi.interfaces.AbstractBrandFactory;
    import iv.factory.feidanyi.yuanshi.interfaces.AbstractFactory;
    import iv.factory.feidanyi.yuanshi.interfaces.CaoMeiWei;
    import iv.factory.feidanyi.yuanshi.interfaces.YuanWei;
    
    public class MengNiuFactory implements AbstractFactory,AbstractBrandFactory {
    
    	public CaoMeiWei createCaoMeiWei() {
    		// TODO Auto-generated method stub
    		return new MengNiuCmw(14);
    	}
    
    	public YuanWei createYuanWei() {
    		// TODO Auto-generated method stub
    		return new MengNiuYw(15);
    	}
    	public String getBrand() {
    		// TODO Auto-generated method stub
    		return new MengNiu().getBrand();
    	}
    }
    


    定义厂家的接口的实现类:伊利厂家:

    package iv.factory.feidanyi.yuanshi.classes;
    
    import iv.factory.feidanyi.yuanshi.interfaces.AbstractBrandFactory;
    import iv.factory.feidanyi.yuanshi.interfaces.AbstractFactory;
    import iv.factory.feidanyi.yuanshi.interfaces.CaoMeiWei;
    import iv.factory.feidanyi.yuanshi.interfaces.YuanWei;
    
    public class YiLiFactory implements AbstractFactory,AbstractBrandFactory {
    
    	public CaoMeiWei createCaoMeiWei() {
    		// TODO Auto-generated method stub
    		return new YiLiCmw(11);
    	}
    
    	public YuanWei createYuanWei() {
    		// TODO Auto-generated method stub
    		return new YiLiYw(12);
    	}
    
    	public String getBrand() {
    		// TODO Auto-generated method stub
    		return new YiLi().getBrand();
    	}
    }
    

    定义顾客类:

    package iv.factory.feidanyi.yuanshi.classes;
    
    import iv.factory.feidanyi.yuanshi.interfaces.AbstractFactory;
    import iv.factory.feidanyi.yuanshi.interfaces.CaoMeiWei;
    import iv.factory.feidanyi.yuanshi.interfaces.YuanWei;
    
    public class Customer {
    	private YuanWei yw =null;
    	private CaoMeiWei cmw = null;
    	
    	public void buyMilk(AbstractFactory af){
    		
    		yw = af.createYuanWei();
    		cmw = af.createCaoMeiWei();
    		yw.getPrice();
    		cmw.getPrice();
    	}
    	
    }


    定义main方法类:

    package iv.factory.feidanyi.yuanshi.classes;
    
    import iv.factory.feidanyi.yuanshi.interfaces.AbstractBrandFactory;
    import iv.factory.feidanyi.yuanshi.interfaces.AbstractFactory;
    
    public class client {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) {
    		// TODO Auto-generated method stub
    		Customer cus = new Customer();
    		AbstractBrandFactory af0 = new MengNiuFactory();
    		AbstractFactory af = new MengNiuFactory();
    		System.out.println(af0.getBrand());
    		cus.buyMilk(af);
    		
    		AbstractBrandFactory af11 = new YiLiFactory();
    		AbstractFactory af1 = new YiLiFactory();
    		System.out.println(af11.getBrand());
    		cus.buyMilk(af1);
    	}
    
    }


    完成。


    动态装载类:

    Class.forName(String类型的类的包路径).newInstance();

    ==================

    封装“改变”是设计模式的原则.

    什么时候使用工厂模式:假设在项目中有非常多地方都须要生产某个对象的实例的话,则能够考虑使用工厂模式。让工厂来生产实例,当须要改动生产实例的方式时,仅仅须要改动project就可以,不用到处改动。

    在什么情况下应当使用抽象工厂模式

      1.一个系统不应当依赖于产品类实例怎样被创建、组合和表达的细节。这对于全部形态的工厂模式都是重要的。

      2.这个系统的产品有多于一个的产品族。而系统仅仅消费当中某一族的产品。

      3.同属于同一个产品族的产品是在一起使用的。这一约束必须在系统的设计中体现出来。

    (比方:Intel主板必须使用Intel CPU、Intel芯片组)

      4.系统提供一个产品类的库,全部的产品以相同的接口出现。从而使client不依赖于实现。

    抽象工厂模式的长处

    • 分离接口和实现

      client使用抽象工厂来创建须要的对象,而client根本就不知道详细的实现是谁,client仅仅是面向产品的接口编程而已。也就是说。client从详细的产品实现中解耦。

    • 使切换产品族变得easy

      由于一个详细的工厂实现代表的是一个产品族,比方上面样例的从Intel系列到AMD系列仅仅须要切换一下详细工厂。

    抽象工厂模式的缺点

    • 不太easy扩展新的产品

      假设须要给整个产品族加入一个新的产品,那么就须要改动抽象工厂,这样就会导致改动全部的工厂实现类。

  • 相关阅读:
    从零开始入门 K8s | 有状态应用编排
    OAM 深入解读:OAM 为云原生应用带来哪些价值?
    你不得不了解 Helm 3 中的 5 个关键新特性
    CNCF 公布 2020 年 TOC 选举结果 | 云原生生态周报 Vol. 36
    调度系统设计精要
    Spring的IOC容器第一辑
    JavaScript工作体系中不可或缺的函数
    教你五步制作精美的HTML时钟
    web前端vertical-align的作用及对象详解
    JavaScript中常见的10个BUG及其修复方法
  • 原文地址:https://www.cnblogs.com/gcczhongduan/p/5124509.html
Copyright © 2011-2022 走看看