设计模式之工厂模式(Factory Pattern)

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。

这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。


我这里选择生产手机的工厂作为模型对象。

一、分析生产手机的过程,形成要模拟的对象。

1、一部手机要被生产出来,首先要设计,备料,制造,测试,装箱等几步;
2、分析手机生产的过程,我们可以知道,备料,制造,测试,装箱是在制造工厂完成,而设计过程一般是在手机公司自己设计;比如,小米公司、苹果公司。
3、到这里,实际上我们可以产生两个对象,一个是手机对象,包括手机的属性和设计过程,另一个是制造手机的工厂对象,包括手机的制造、测试、装箱。


二、根据分析结果,实现两个对象
1、工厂对象
工厂对象负责生产手机,因为一个工厂可以生产多种手机,所以,工厂对象里面可以分为两部分,一部分是相同同的生产部分,一部分是不同的生产部分;
同时,我们会有不同的工厂来生产手机,所以,我们把工厂方法抽象,让具体的工厂子类去继承;
/**
 * 工厂抽象类,方便于统一管理,标准生产
 * zhuyuehao
 * 2018/3/7下午2:31
 */
public abstract class AbstractPhotoFactory {
    //相同的部分,公共的逻辑
    public final Photo orderPhoto(String type){
        Photo photo;
        //实例化要生产的手机
        photo = createPhoto(type);
        if(photo==null){
            System.out.println("不能生产该手机!");
            System.out.println("-----------------------------------end");
            return null;
        }
        photo.prepare();
        photo.make();
        photo.test();
        photo.box();
        System.out.println("-----------------------------------end");
        return photo;
    }
    //不同的部分,生产不同手机
    /**
     * 生产手机
     * @return Photo
     */
    public abstract Photo createPhoto(String type);
}


/**
 * 富士康工厂
 * zhuyuehao
 * 2018/3/8上午11:24
 */
public class FoxconnFactory extends AbstractPhotoFactory {
    public Photo createPhoto(String type) {
        if("小米".equals(type)){
            return new XiaoMiPhoto();
        }else if ("华为".equals(type)){
            return new HuaWeiPhoto();
        }else if ("苹果".equals(type)){
            return new ApplePhoto();
        }else return null;
    }
}


/**
 * 伟创力工厂
 * zhuyuehao
 * 2018/3/8上午11:24
 */
public class FlextronicsFactory extends AbstractPhotoFactory {
    public Photo createPhoto(String type) {
        if("小米".equals(type)){
            return new XiaoMiPhoto();
        }else if ("华为".equals(type)){
            return new HuaWeiPhoto();
        }else return null;
    }
}


2、手机对象
我们需要生产小米、华为、苹果三款手机,我们可以定义三个手机对象,当然,因为手机对象有很多相同之处,所以,我们也可以用一个抽象的类作为父类;
/**
 * 手机的抽象类,父类
 * 包括手机的属性,及生产手机的过程
 * zhuyuehao
 * 2018/3/7上午9:42
 */
public abstract class Photo {


    /**
     * 手机颜色
     */
    private String color;


    /**
     * 屏幕尺寸
     */
    private String screenSize;


    /**
     * 牌子名称
     */
    private String sign;




    ArrayList toppings = new ArrayList();




    /**
     * 准备流程,物料准备
     */
    public void prepare(){
        System.out.println("Preparing:" + sign);
        System.out.println("Adding color:" + color);
        System.out.println("Adding screenSize:" + screenSize);
        /**
         * 子类扩展流程
         */
        for(int i=0;i<toppings.size();i++){
            System.out.println("Adding specific:" + toppings.get(i));
        }
    }


    /**
     * 制造
     */
    public void make(){
        System.out.println("Making...");
    }


    /**
     * 测试
     */
    public void test(){
        System.out.println("Testing...");
    }


    /**
     * 装箱
     */
    public void box(){
        System.out.println("Place photo in official photo box");
    }






    public String getColor() {
        return color;
    }


    public void setColor(String color) {
        this.color = color;
    }


    public String getScreenSize() {
        return screenSize;
    }


    public void setScreenSize(String screenSize) {
        this.screenSize = screenSize;
    }


    public String getSign() {
        return sign;
    }


    public void setSign(String sign) {
        this.sign = sign;
    }


    @Override
    public String toString() {
        return "Photo{" +
                "color='" + color + '\'' +
                ", screenSize='" + screenSize + '\'' +
                ", sign='" + sign + '\'' +
                '}';
    }
}


/**
 * zhuyuehao
 * 2018/3/8上午11:01
 */
public class XiaoMiPhoto extends Photo {
    public XiaoMiPhoto() {
        setColor("black");
        setScreenSize("5.0");
        setSign("小米5");
        toppings.add("电池");
    }


    @Override
    public void test() {
        System.out.println("Test500 hours");
    }
}


/**
 * zhuyuehao
 * 2018/3/8上午11:20
 */
public class HuaWeiPhoto extends Photo {
    public HuaWeiPhoto() {
        setColor("yellow");
        setScreenSize("5.12");
        setSign("华为P10");
    }
}


/**
 * zhuyuehao
 * 2018/3/8上午11:20
 */
public class ApplePhoto extends Photo {
    public ApplePhoto() {
        setColor("white");
        setScreenSize("4.7");
        setSign("iphone X");
        toppings.add("Add IOS");
    }
}


三、测试
public class AbsFactoryTest {
    public static void main(String[] args) {
        //实例化一个富士康工厂
        AbstractPhotoFactory foxconnFactory = new FoxconnFactory();
        foxconnFactory.orderPhoto("小米");
        //富士康工厂生产苹果手机
        foxconnFactory.orderPhoto("苹果");
        //富士康工厂生产华为手机
        foxconnFactory.orderPhoto("华为");


        //实例化一个伟创力工厂
        AbstractPhotoFactory flextronicsFactory = new FlextronicsFactory();
        flextronicsFactory.orderPhoto("小米");
        //伟创力工厂生产苹果手机
        flextronicsFactory.orderPhoto("苹果");
        //伟创力工厂生产华为手机
        flextronicsFactory.orderPhoto("华为");
    }
}


运行结果:
Preparing:小米5
Adding color:black
Adding screenSize:5.0
Adding specific:电池
Making...
Test500 hours
Place photo in official photo box
-----------------------------------end
Preparing:iphone X
Adding color:white
Adding screenSize:4.7
Adding specific:Add IOS
Making...
Testing...
Place photo in official photo box
-----------------------------------end
Preparing:华为P10
Adding color:yellow
Adding screenSize:5.12
Making...
Testing...
Place photo in official photo box
-----------------------------------end
Preparing:小米5
Adding color:black
Adding screenSize:5.0
Adding specific:电池
Making...
Test500 hours
Place photo in official photo box
-----------------------------------end
不能生产该手机!
-----------------------------------end
Preparing:华为P10
Adding color:yellow
Adding screenSize:5.12
Making...
Testing...
Place photo in official photo box
-----------------------------------end


四、总结
上面是对抽象工厂模式的简单实现,通过抽象工厂,我们不需要知道工厂内部是如何做的,就可以得到我们想要的产品;

同时,通过抽象类的应用,当有新的工厂和新的手机时,可以很方便的扩展。


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值