博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
工厂模式的理解和使用
阅读量:4551 次
发布时间:2019-06-08

本文共 3720 字,大约阅读时间需要 12 分钟。

一、是什么

1. 定义

  工厂方法模式: 由子类决定要创建的具体类是哪一个

  抽象工厂: 允许客户创建对象的家族,而无需指定他们的具体类

2. 理解

  从定义中可以看出, 抽象工厂包含了工厂方法,区别是抽象工厂创建的是家族

3. 好处:

  封装具体对象的创建,促进松耦合

4. 设计原则

  依赖倒置原则--依赖抽象,不依赖具体类

二、示例

工厂方法

1. 工厂相关类

/** * 工厂 */public abstract class Factory {    public abstract Milk makeMilk();}/** * A 工厂 */public class FactoryA extends Factory {    @Override    public Milk makeMilk() {        return new MilkA();    }}/** * B 工厂 */public class FactoryB extends Factory {    @Override    public Milk makeMilk() {        return new MilkB();    }}

2. 牛奶类

/** * 产品抽象类 */public abstract class Milk {    public abstract void print();}/** * 产品A */public class MilkA extends Milk {    @Override    public void print() {        System.out.println("我是牛奶A");    }}/** * 产品B */public class MilkB extends Milk {    @Override    public void print() {        System.out.println("我是牛奶B");    }}

3. 测试

/** * 测试类 */public class Main {    public static void main(String[] args) {        Factory factoryA = new FactoryA();        Factory factoryB = new FactoryB();        Milk milkA = factoryA.makeMilk();        Milk milkB = factoryB.makeMilk();        milkA.print();        milkB.print();    }}

抽象工厂

1. 代码背景,分为南京和杭州两家工厂,他们各自生产自己的产品

2. 芝士

/** * 芝士 */public abstract class Cheese {    public String address = "";    public Cheese(String address) {        this.address = address;    }    public abstract void print();}/** * 南京生产的芝士 */public class NanJingCheese extends Cheese {    public NanJingCheese(String address) {        super(address);    }    @Override    public void print() {        System.out.println(address + "的芝士");    }}/** * 杭州芝士 */public class HangZhouCheese extends Cheese {    public HangZhouCheese(String address) {        super(address);    }    @Override    public void print() {        System.out.println(address + "的芝士");    }}

3. 牛奶

/** * 产品抽象类 */public abstract class Milk {    public String address = "";    public Milk(String address) {        this.address = address;    }    public abstract void print();}/** * 南京的牛奶 */public class NanJingMilk extends Milk {    public NanJingMilk(String address) {        super(address);    }    @Override    public void print() {        System.out.println(address + "的牛奶");    }}/** * 杭州牛奶 */public class HangZhouMilk extends Milk {    public HangZhouMilk(String address) {        super(address);    }    @Override    public void print() {        System.out.println(this.address + "的牛奶");    }}

3. 工厂: 生产一组产品

/** * 抽象工厂类 */public abstract class Factory {    public abstract Milk makeMilk();    public abstract Cheese makeCheese();}/** * 南京工厂 */public class NanJingFactory extends Factory {    @Override    public Milk makeMilk() {        return new NanJingMilk("南京江宁");    }    @Override    public Cheese makeCheese() {        return new NanJingCheese("南京江宁");    }}/** * 杭州工厂 */public class HangZhouFactory extends Factory {    @Override    public Milk makeMilk() {        return new HangZhouMilk("杭州萧山");    }    @Override    public Cheese makeCheese() {        return new HangZhouCheese("杭州萧山");    }}

4. 测试

/** * 测试类 */public class Main {    public static void main(String[] args) {        Factory hangZhouFactory = new HangZhouFactory();        Cheese hangZhouCheese = hangZhouFactory.makeCheese();        Milk hangZhouMilk = hangZhouFactory.makeMilk();        hangZhouCheese.print();        hangZhouMilk.print();        Factory nanJingFactory = new NanJingFactory();        Cheese nanJingCheese = nanJingFactory.makeCheese();        Milk nanJingMilk = nanJingFactory.makeMilk();        nanJingCheese.print();        nanJingMilk.print();    }}

三、总结

1. 所有工厂的目的都是封装对象的创建

2.工厂方法使用的是继承,把对象的创建委托给子类,子类来实现工厂方法来创建对象

3. 使用工厂模式的好处: 减少应用程序和具体类之间的依赖促进松耦合

转载于:https://www.cnblogs.com/milicool/p/11278608.html

你可能感兴趣的文章
提交图片
查看>>
走进AngularJs(一)angular基本概念的认识与实战
查看>>
python 传参问题
查看>>
rpm命令的使用
查看>>
python 面向对象
查看>>
暑假第一周进度总结
查看>>
The Anatomy of a COM Server(Chapter 2 of COM and .NET Interoperability) part2
查看>>
mysql的Navicat查看数据库的ER图
查看>>
A熟知SP.NET---WebForms UnobtrusiveValidationMode 必须“jquery”ScriptResourceMapping。
查看>>
alternatives命令使用方法
查看>>
IDEA Maven配置
查看>>
mapreduce 实现矩阵乘法
查看>>
Jquery EasyUI封装简化操作
查看>>
OO第一单元总结
查看>>
[原创]你所需要了解的软件测试相关标准
查看>>
最近这么火的iOS视频直播
查看>>
程序员陪女朋友自拍杆哪个好?自拍杆品牌推荐
查看>>
output 参数在存储过程中的用法
查看>>
大数加法和乘法(高精度)
查看>>
利用SynchronizationContext.Current在线程间同步上下文
查看>>