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

    首先工厂模式分为三种:简单工厂模式、工厂方法模式、抽象工厂模式。下面分别介绍这三种模式。

     注:在设计模式中,所谓的“实现一个接口”,并“不一定”表示写一个类,并利用implement来实现某个接口,而是泛指实现某个超类型(可以是接口或类)的某个方法。

    一:简单工厂模式

      简单工厂模式其实不是一个设计模式,反而更想是一种编程习惯。将可变的和不可变的分离出来。

      简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个种类(这些种类继承自一个父类或接口)的实例。下面我们看下披萨工厂创建披萨给披萨店,代码如下:

    public class SimplePizzaFactory {
        
        public Pizza createPizza(String type){
            Pizza pizza = null;
            
            if(type.equals("cheese")){
                pizza = new CheesePizza();
            }
            else if(type.equals("pepperoni")){
                pizza = new PepperoniPizza();
            }
            return pizza;
        }
    }
    public class PizzaStore {
        SimplePizzaFactory factory;
        
        public PizzaStore(SimplePizzaFactory factory){
            this.factory = factory;
        }
        
        public Pizza orderPizza(String type){
            Pizza pizza;
            pizza = factory.createPizza(type);
            
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
            return pizza;
        }
    }

      具体的披萨种类和披萨类后续会有代码,并且后续介绍另外两种模式时,会对有关代码进行一定修改。

    二:工厂方法模式

      工厂方法模式定义一个用于创建对象的接口,让子类决定实例化哪个类。在简单工厂模式中,新增类型需要改动工厂类,而工厂方法模式使之前的体系无需修改,完全符合了开发-封闭原则。但工厂方法模式在客户端中还是需要进行逻辑判断,决定需要实例化哪一个工厂来实现实现类。例子代码如下:

      首先创建一个抽象的Pizza类

    package com.learn.factory;
    import java.util.ArrayList;
    
    public abstract class Pizza {
        protected String name ;
        protected String dough;
        protected String sauce;
        protected ArrayList toppings = new ArrayList();
        
        void prepare(){
            System.out.println("Preparing  " + name);
            System.out.println("Tossing dough  ");
            System.out.println("Adding sauce");
            System.out.println("Adding toppings:");
            for(int i = 0 ; i<toppings.size() ; i++){
                System.out.println(toppings.get(i));
            }
        }
        
        void bake(){
            System.out.println("Bake for 25 minutes at 350");
        }
        void cut(){
            System.out.println("Cutting the pizza into diagonal slices");
        }
        void box(){
            System.out.println("Place pizza in official PizzaStore box");
        }
        
        public String getName(){
            return name;
        }
    }

      然后创建具体的披萨类

    public class ChicagoStyleCheesePizza extends Pizza{
        public ChicagoStyleCheesePizza(){
            name = "Chicago Style Deep Dish Cheese Pizza";
            dough = "Extra Thick Crust Dough";
            sauce = "Plum Tomato Sauce";
            toppings.add("Shredded Mozzarella Cheese");
        }
        
        public String getName(){
            return name;
        }
    }
    public class NYStyleCheesePizza extends Pizza{
        public NYStyleCheesePizza(){
            name = "NY Style Sauce and Cheese Pizza";
            dough = "Thin Crust Dough";
            sauce = "Marinara Sauce";
            toppings.add("Grated Reggiano Cheese");
        }
        
        public String getName(){
            return name;
        }
    }
    等等披萨种类

      接着创建抽象的披萨店类

    public abstract class PizzaStore {
        
        public Pizza orderPizza(String type){
            Pizza pizza;
            pizza = createPizza(type);
            
            pizza.prepare();
            pizza.bake();
            pizza.cut();
            pizza.box();
            return pizza;
        }
        //不同披萨店需要实现的方法
        abstract Pizza createPizza(String type);
    }

      然后创建具体的披萨店类

    public class NYPizzaStore extends PizzaStore {
    
        @Override
        Pizza createPizza(String type) {
            if(type.equals("cheese")){
                return new NYStyleCheesePizza();
            }
            else if(type.equals("veggie")){
                return new NYStyleVeggiePizza();
            }
            return null;
        }
        
    }
    
    public class ChicagoStyleStroe extends PizzaStore{
    
        @Override
        Pizza createPizza(String type) {
            if(type.equals("cheese")){
                return new ChicagoStyleCheesePizza();
            }
            return null;
        }
        
    }

      最后进行测试:

    public class Test {
        public static void main(String[] args) {
            PizzaStore nyStore = new NYPizzaStore();
            PizzaStore chicagoStore = new ChicagoStyleStroe();
            
            Pizza pizza = nyStore.orderPizza("cheese");
            System.out.println("NY ordered a " + pizza.getName());
            System.out.println("----------");
            pizza =chicagoStore.orderPizza("cheese");
            System.out.println("Chicago ordered a " + pizza.getName());
    
        }
    }

      运行结果:

         

    三:抽象工厂模式

      抽象工厂模式:提供一个接口,用于创建相关或依赖对象的家族,而不需要指明具体类。多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。 

    //抽象产品类1
    public interface IProduct1 {
         public void show();  
    }
    
    //抽象产品类2
    public interface IProduct2 {
         public void show();  
    }
    
    //具体产品类1
    public class Product1 implements IProduct1 {  
        public void show() {  
            System.out.println("产品1");  
        }
    }
    
    //也是具体产品类1
    public class Product1_1 implements IProduct1 {  
        public void show() {  
            System.out.println("也是产品1");  
        }
    }
    
    
    //具体产品类2
    public class Product2 implements IProduct2 {  
        public void show() {  
            System.out.println("产品2");  
        }  
    } 
    
    //抽象工厂类
    public interface IFactory {
        public IProduct1 createProduct1();  
        public IProduct2 createProduct2();  
    }
    
    //具体工厂类One
    public class OneFactory implements IFactory{
        public IProduct1 createProduct1() {  
                return new Product1();  
        }  
        public IProduct2 createProduct2() {  
            return new Product2();  
        }  
    }
    
    //具体工厂类Two
    public class TwoFactory implements IFactory{
        public IProduct1 createProduct1() {  
            return new Product1_1();  
        }  
        public IProduct2 createProduct2() {  
            return new Product2();  
        }  
    }
    //测试类
    public class Test {
        public static void main(String[] args){  
            IFactory factory = new OneFactory();  
            factory.createProduct1().show();  
            factory.createProduct2().show();  
            
            factory = new TwoFactory();
            factory.createProduct1().show();
            factory.createProduct2().show();
        }  
    }

    运行结果:

    产品1
    产品2
    也是产品1
    产品2

    四:总结:

      简单工厂模式:用来生产同一等级结构中的任意产品。

      工厂方法模式 :用来生产同一等级结构中的固定产品。

      抽象工厂模式 :用来生产不同产品族的全部产品。

      下一节:单例模式

    作者:哀&RT
    出处:博客园哀&RT的技术博客--http://www.cnblogs.com/Tony-Anne/
    您的支持是对博主最大的鼓励,感谢您的认真阅读。
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    每日问题汇总:2016-3-28
    DataList、Repeater、GridView中的Checkbox取值问题
    长数字字符串逗号分隔
    文字环绕图片效果
    js图片放大镜 可动态更换图片
    动态页面生成静态页
    SQL按汉语拼音首字母排序
    JS软键盘代码
    JS判断RadioButtonList是否有选中项
    简单获取两个时间的时间差函数
  • 原文地址:https://www.cnblogs.com/Tony-Anne/p/6411888.html
Copyright © 2011-2022 走看看