工厂模式

作者: Chauncey_Chen | 来源:发表于2016-12-23 09:23 被阅读118次

    工厂模式

    就是工厂---生产-->产品

    在设计模式中,分为 简单工厂模式, 工厂方法模式,抽象工厂模式.

    工厂模式,就是:
    提供创建对象的功能,不需要关心具体实现.

    类似于,接口隔离(模块和模块):不需要知道具体的构建过程,就能得到相应的结果.
    例如,
    Bitmap bitmap=BitmapFactory.decodeXXX();
    decodeXXX 其实是创建了不同的bitmap.不用关心如何生产出bitmap

    简单工厂:

    以生产 二维图形 为例.

    1. 工厂类角色:这是本模式的核心,含有一定的商业逻辑和判断逻辑。在java中它往往由一个具体类实现。

    2. 抽象产品角色:它一般是具体产品继承的父类或者实现的接口。在java中由接口或者抽象类来实现。

    3. 具体产品角色:工厂类所创建的对象就是此角色的实例。在java中由一个具体类实现。

    类图

    代码实现

    1.产品抽象类

    public class Shape {
       /** @pdOid 6679a38e-beee-4da3-8749-c03329cfd976 */
       public void sayHello() {
          // TODO: implement
           
       }
    
    }
    
    

    2.产品实体类

    public class Circle extends Shape {
       /** @pdOid 2abc7174-03ad-4365-8fff-3265612a3185 */
       private int radium;
       
       /** @pdOid b39ccef4-0987-473b-8e7d-1b8959c50985 */
       public void sayHello() {
           
           System.out.println("Hello, I am Circle from ShapeFactory!My address is "+this.hashCode());
       }
    
    }
    
    public class Traingle extends Shape {
       /** @pdOid 4911552c-ce2f-41e3-8a8f-d342dd482e50 */
       private int high;
       /** @pdOid 519ef847-62d8-435b-89a7-234c2fb5fcba */
       private int bottom;
       
       /** @pdOid 433ff6ef-9fbc-44f2-b159-97d17c6153a6 */
       public void sayHello() {
          // TODO: implement
           System.out.println("Hello, I am Traingle from ShapeFactory! My address is "+this.hashCode());
       }
    
    }
    
    

    3.图形工厂类(包括缓存模式)

    public class ShapeFactory {
    
        
       private static HashMap<String,Shape> shapeMap=new HashMap<>();
       
        /**
         * 简单工厂创建
         * @param type Traingle创建三角形traingle,Circle创建圆形Circle
         * @return Shape
         */
        public static Shape create(String type) {
            Shape shape = null;
            switch (type) {
            case "Traingle":
                //
                shape=new Traingle();
                break;
            case "Circle":
                shape=new Circle();
                break;
            default:
                break;
            }
            return shape;
        }
    
        /**
         * 简单工厂创建---单例缓存
         * @param type Traingle创建三角形traingle,Circle创建圆形Circle
         * @return Shape
         */
        public static Shape createSingle(String type) {
            Shape shape = null;
            switch (type) {
            case "Traingle":
                shape = getSingleFromMap(type);
                break;
            case "Circle":
                shape = getSingleFromMap(type);
                break;
            default:
                break;
            }
            return shape;
        }
    
        private static Shape getSingleFromMap(String type) {
            Shape shape;
            if(shapeMap.get(type)==null){
                shape=new Traingle();
                shapeMap.put(type, shape);
            }else{
                shape=shapeMap.get(type);
            }
            return shape;
        }
        
        
    
        
    }
    
    

    测试类

    public class Test {
        
        
        public static void main(String[] args) {
            System.out.println("============简单工厂模式==================");
    
            Shape traingle =ShapeFactory.create("Traingle");
            traingle.sayHello();
            Shape circle =ShapeFactory.create("Circle");
            circle.sayHello();
            Shape traingle3 =ShapeFactory.create("Traingle");
            traingle3.sayHello();
            Shape circle3 =ShapeFactory.create("Circle");
            circle3.sayHello();
            System.out.println("============简单工厂---缓存模式==================");
            
            Shape traingle1 =ShapeFactory.createSingle("Traingle");
            traingle1.sayHello();
            Shape circle1 =ShapeFactory.createSingle("Circle");
            circle1.sayHello();
            Shape traingle2 =ShapeFactory.createSingle("Traingle");
            traingle2.sayHello();
            Shape circle2 =ShapeFactory.createSingle("Circle");
            circle2.sayHello();
        }
    
    }
    

    工厂方法模式

    是简单工厂模式的优化版,
    有一个工厂抽象类,然后有很多具体的工厂.

    当有新的产品需要生产时候,只需要新建一个具体工厂,就能生产,而不是在原来的工厂中,进行修改. 每个具体工厂类只能创建一个具体产品类的实例。 体现了修改关闭原则.

    • 抽象工厂角色: 这是工厂方法模式的核心,它与应用程序无关。是具体工厂角色必须实现的接口或者必须继承的父类。在java中它由抽象类或者接口来实现。

    • 具体工厂角色:它含有和具体业务逻辑有关的代码。由应用程序调用以创建对应的具体产品的对象。

    • 抽象产品角色:它是具体产品继承的父类或者是实现的接口。在java中一般有抽象类或者接口来实现。

    • 具体产品角色:具体工厂角色所创建的对象就是此角色的实例。在java中由具体的类来实现。

    类图举例

    代码实现

    1.抽象产品类(同简单工厂)

    2.具体产品类(同简单工厂)

    3.一个抽象工厂类

    public abstract class ShapeFactory {
       /** @pdOid 4a15aecb-010c-4d48-811a-92b793f6612b */
       public abstract Shape create();
    
    }
    
    

    4.多个具体工厂类

    
    public class CircleFactory extends ShapeFactory {
       /** @pdOid ffffb088-9334-47a3-bfb8-f99ddd6c77a1 */
       public Shape create() {
          // TODO: implement
          return new Circle();
       }
    
    public class TraingleFactory extends ShapeFactory {
       /** @pdOid 50f4544e-9c7a-407b-9478-247f45072997 */
       public Shape create() {
          // TODO: implement
          return new Traingle();
       }
       
    
    }
    
    

    5.测试类

    
    public class Test {
        
        
        public static void main(String[] args) {
            
            System.out.println("==========工厂方法模式=========");
            
            ShapeFactory factory=new TraingleFactory();
            Shape shape=factory.create();
            shape.sayHello();
            ShapeFactory factory1=new CircleFactory();
            Shape shape1=factory1.create();
            shape1.sayHello();
        }
    }
    
    
    ==========工厂方法模式=========
    
    Hello, I am Traingle from ShapeFactory! My address is 366712642
    
    Hello, I am Circle from ShapeFactory!My address is 1829164700
    

    抽象工厂模式

    抽象工厂模式: 多个抽象产品类,每个抽象产品类可以派生出多个具体产品类。 一个抽象工厂类,可以派生出多个具体工厂类。 每个具体工厂类可以创建多个具体产品类的实例。

    类图

    代码实现

    1.抽象产品

    
    public interface Color {
       /** @pdOid a12f0089-9a07-4426-8f7e-af49aa2a79bb */
       int fill();
    
    }
    
    public interface Shape {
       /** @pdOid 5a0c95e5-55e1-471e-a61a-740a673aece8 */
       int draw();
    
    }
    
    

    2.抽象工厂

    public abstract class AbstractFactory {
       /** @pdOid 11ac6789-7964-4e4a-87a9-a64a69a506e5 */
       public abstract Color getColor(String type);
       /** @pdOid 3a57f707-a85a-4703-a3ff-084c6dd11587 */
       public abstract Shape getShape(String type);
    
    }
    
    

    3.实体工厂

    
    public class ColorFactory extends AbstractFactory {
        /** @pdOid 4fb42edd-3722-4c38-9e14-86435450ccc1 */
        public Color getColor(String shapeType) {
            // TODO: implement
            if (shapeType.equals("Red")) {
                return new Red();
            } else if (shapeType.equals("Blue")) {
                return new Blue();
    
            }
            return null;
        }
    
    @Override
    public Shape getShape(String type) {
        // TODO Auto-generated method stub
        return null;
    }
    
    }
    
    /** @pdOid 5f64c413-67bb-4255-9197-9fb9f9a6d502 */
    public class ShapeFactory extends AbstractFactory {
       /** @pdOid 4e659634-78f7-48ae-9751-d3beaf5cc550 */
       public Shape getShape(String shapeType) {
            if (shapeType.equals("Traingle")) {
                return new Traingle();
            } else if (shapeType.equals("Circle")) {
                return new Circle();
    
            }
            return null;
       }
    
    @Override
    public Color getColor(String shapeType) {
        // TODO Auto-generated method stub
        return null;
    }
    
    }
    
    

    4.创建工厂的驱动

    
    public class FactoryCreator {
    
        public static AbstractFactory createFactory(String type){
            
            if (type.equals("Color")) {
                return new ColorFactory();
            } else if (type.equals("Shape")) {
                return new ShapeFactory();
    
            }
            return null;
            
            
            
        }
        
        
    }
    
    

    测试

    
    public class Test {
    
        public static void main(String[] args) {
            
            
            System.out.println("==========抽象工厂模式=========");
            AbstractFactory factory = FactoryCreator.createFactory("Color");
            factory.getColor("Red").fill();
            
            System.out.println("==========极限调用.感觉好帅...=========");
            FactoryCreator.createFactory("Shape").getShape("Circle").draw();
    
        }
    }
    
    
    
    ==========抽象工厂模式=========
    Hello, I am Red from ColrFactory!My address is 366712642
    ==========极限调用.感觉好帅...=========
    Hello, I am Circle from ShapeFactory!My address is 1829164700
    
    

    工厂总结

    简单工厂模式:

    0.实体产品:产品是什么,能抽象成什么.

    1.要知道要什么产品,将产品抽象话,作为抽象产品(产品抽象类),

    2.建一个实体工厂,准备开工.

    3.生产同一类产品的不同型号(就像同一种猪不同的大小,重量等).

    优点:灵活,简单

    工厂方法:

    0.实体产品:产品是什么,能抽象成什么.

    1.抽象产品:目前有一种类型,不同型号的产品(图形),

    2.抽象工厂:工厂要做生产不同图形.

    3.建立实体工厂:分别将要生产的同类型的产品,按照不同型号(三角形,圆形)分别创建工厂.由实 体工厂提供产品.

    优势:以后如果想要生产一个不同的产品,就可以直接 创建产品实体,继承抽象工厂创建实体工厂,进行生产,而不修改其他,体现开闭原则

    抽象工厂模式:

    抽象二字,体现在 抽象工厂,抽象出要生产的产品种类.

    当有多种产品的时候(多个产品族),可以考虑用抽象工厂模式,用一个抽象工厂(抽象出所需要的产品种类),然后用多个实体工厂(建造同族中不同的产品).

    当有新的产品进入的时候,只需要添加抽象产品到抽象工厂,然后创建相应的工厂即可,
    体现了依赖倒置原则 :依赖于抽象,依赖于抽象,即程序中所有的依赖关系都应该终止于抽象类或者接口.要针对接口编程,不针对实现编程。

    优势:针对于多种产品,抽象出所需产品即可.

    缺点:模式过于臃肿,添加产品要修改抽象工厂.

    区别: 工厂方法模式只有一个抽象产品类,而抽象工厂模式有多个。 工厂方法模式的具体工厂类只能创建一个具体产品类的实例,而抽象工厂模式可以创建多个。

    总而言之,
    工厂模式,是利用封装,继承和多态属性,实现父类引用指向子类对象,进行依赖倒置,面向抽象和接口编程,实现同一父类下各个子类的互换,而客户端可以毫不察觉。进而达到 不需要知道具体的构建过程,就能得到相应的结果.并尽量保持对扩展开放,对修改关闭.

    模式,就是模式,没有必要完全遵守,适时适地,灵活运用,才是根本..

    自己愚见,未能深刻领悟,有不足之处,希望能一起探讨.

    相关文章

      网友评论

        本文标题:工厂模式

        本文链接:https://www.haomeiwen.com/subject/zbfkvttx.html