设计模式--[1]工厂模式

工厂模式

就是工厂—生产–>产品

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

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

类似于,接口隔离(模块和模块):不需要知道具体的构建过程,就能得到相应的结果.
例如,
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.建立实体工厂:分别将要生产的同类型的产品,按照不同型号(三角形,圆形)分别创建工厂.由实 体工厂提供产品.

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

抽象工厂模式:

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

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

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

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

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

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

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

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值