设计模式(java)- 工厂模式

之前学的是装饰者模式

装饰者模式的优点

动态地为对象增加新的功能或者撤销功能(继承就不能做到这一点)

装饰者模式的缺点

会产生过多的相似的对象!

一、对工厂模式的理解

简单工厂:通过工厂类生成不同的类。工厂类返回一个父类型的类,通过if或者switch判断用户给的数据,通过不同的数据返回不同的类。
工厂方法:比较重要的就是抽象类里面的一个抽象方法,所有继承了抽象类的类都必须实现该方法,之后在调用的时候利用多态动态的调用实现类的方法。抽象的方法里面就可以用简单工厂模式实现不同的类

二、代码实现(简单工厂、工厂方法、抽象工厂)

1、简单工厂

创建月饼类

public class MoonCake {
    public String name;
    public void kenad() {
        System.out.println("揉面粉");
    }
    public String getName() {
        return name;
    }
}
// 糖陷月饼
class sugar extends MoonCake{
    public sugar(){
        System.out.println("糖陷");
    }
}
// 肉陷月饼
class meat extends MoonCake {
    public meat() {
        System.out.println("肉馅");
    }
}

创建简单月饼工厂

public class SimpleFactory {
    public MoonCake createProduct(String type) {
        MoonCake product = null;
        if (type.equals("meat")){
            product = new meat();
        } else if (type.equals("sugar")) {
            product = new sugar();
        }
        return product;
    }
}

创建月饼工厂

public class MoonCakeFactory {
    SimpleFactory factory;
    public MoonCakeFactory(SimpleFactory factory) {
        this.factory = factory;
    }
    public MoonCake orderMoonCake(String type) {
        MoonCake product = factory.createProduct(type);
        return product;
    }
}

main方法实现

public class run {
    public static void main(String args[]) {
        // 简单工厂模式 生产月饼
        SimpleFactory simpleFactory = new SimpleFactory();
        new MoonCakeFactory(simpleFactory).orderMoonCake("meat");
    }
}

运行结果

肉馅

2、工厂方法
月饼店抽象类

// 月饼店
public abstract class MoonCakeStore {
    public MoonCake orderMoonCake(String type) {
        MoonCake mc;
        mc = createMoonCake(type);
        mc.kenad();
        return mc;
    }
    // 抽象的工厂方法
    public abstract MoonCake createMoonCake(String type);
}

北方月饼店和南方月饼店

// 北方月饼店
public class NorthMoonCakeStore extends MoonCakeStore{

    @Override
    public MoonCake createMoonCake(String type) {
        if (type.equals("meat")) {
            return new NorthSytleMeatMoonCake();
        } else if (type.equals("sugar")) {
            return new NorthSytleSugarMoonCake();
        }
        return null;
    }
}

// 南方月饼店
public class SouthMoonCakeStroe extends MoonCakeStore{

    @Override
    public MoonCake createMoonCake(String type) {
        if (type.equals("meat")) {
            return new SouthSytleMeatMoonCake();
        } else if (type.equals("sugar")) {
            return new SouthSytleSugarMoonCake();
        }
        return null;
    }
}

月饼父类

public class MoonCake {
    public String name;
    public void kenad() {
        System.out.println("揉面粉");
    }
    public String getName() {
        return name;
    }
}

北方月饼和南方月饼

class SouthSytleMeatMoonCake extends MoonCake{
    public SouthSytleMeatMoonCake() {
        name ="南方风格的肉馅月饼";
    }
}
class SouthSytleSugarMoonCake extends MoonCake{
    public SouthSytleSugarMoonCake() {
        name = "南方风格的糖陷月饼";
    }
}

main方法实现

public class run {
    public static void main(String args[]) {
        // 工厂方法模式 生产月饼
        MoonCakeStore mcs = new SouthMoonCakeStroe();
        MoonCakeStore smcs = new NorthMoonCakeStore();
        
        MoonCake mc = mcs.orderMoonCake("meat");
        System.out.println(mc.getName());
        
        MoonCake mc1 = smcs.orderMoonCake("meat");
        System.out.println(mc1.getName());
    }
}

运行结果

揉面粉
南方风格的肉馅月饼
揉面粉
北方风格的肉馅月饼

3.抽象工厂

创建一个抽象月饼类

// 面粉基类
class flour {
    
}

// 芝麻基类
class sesame{
    
}
// 重构之前的抽象月饼类
public abstract class MoonCake1 {
    String name;
    flour flour;
    sesame sesame;
    public void kenad() {
        System.out.println("揉面粉");
    }
    public String getName() {
        return name;
    }
    // 准备
    abstract void prepare();
}
//糖陷月饼
class sugar1 extends MoonCake1{
    MaterailFactory materailFactory;
    public sugar1(){
        System.out.println("糖陷");
    }
    public sugar1(MaterailFactory materailFactory) {
        name = "糖陷月饼";
        this.materailFactory = materailFactory;
    }
    @Override
    void prepare() {
        System.out.println("准备制作月饼了");
        flour = this.materailFactory.createFlour();
        sesame = this.materailFactory.createSesame();
    }
}
//肉陷月饼
class meat1 extends MoonCake1 {
    MaterailFactory materailFactory;
    public meat1() {
        System.out.println("肉馅");
    }
    public meat1(MaterailFactory materail) {
        this.materailFactory = materail;
    }
    @Override
    void prepare() {
        flour = this.materailFactory.createFlour();
        sesame = this.materailFactory.createSesame();
    }
}

抽象月饼店

// 月饼店抽象类   
public abstract class MoonCakeStore1 {
    public MoonCake1 orderMoonCake(String type) {
        MoonCake1 mc;
        mc = createMoonCake(type);
        mc.kenad();
        mc.prepare();
        return mc;
    }
    // 抽象的工厂方法
    public abstract MoonCake1 createMoonCake(String type);
}

材料接口

// 材料工厂接口
public interface MaterailFactory {
    public flour createFlour();
    public sesame createSesame();
}

南方材料工厂实现材料接口

// 南方材料工厂
public class SouthMaterailFactory implements MaterailFactory{

    @Override
    public flour createFlour() {
        return new SouthFlour();
    }

    @Override
    public sesame createSesame() {
        return new SouthSesame();
    }
}
// 南方面粉
class SouthFlour extends flour{
    public SouthFlour() {
        System.out.println("南方的独特制作的面粉");
    }
}
// 南方芝麻
class SouthSesame extends sesame{
    public SouthSesame() {
        System.out.println("南方的独特制作的芝麻");
    }
}

南方月饼店继承抽象月饼店

// 南方月饼店
public class SouthMoonCakeStroe1 extends MoonCakeStore1{

    @Override
    public MoonCake1 createMoonCake(String type) {
        MaterailFactory mf = new SouthMaterailFactory();
        if (type.equals("meat")) {
            return new sugar1(mf);
        } else if (type.equals("sugar")) {
            return new meat1(mf);
        }
        return null;
    }
}

运行代码

public class run {
    public static void main(String args[]){
        MoonCakeStore1 mcs1 = new SouthMoonCakeStroe1();
        
        MoonCake1 mc12 = mcs1.orderMoonCake("meat");
        System.out.println(mc12.getName());
        MoonCake1 mc11 = mcs1.orderMoonCake("meat");
        System.out.println(mc11.getName());
    }
}

运行结果

揉面粉
准备制作月饼了
南方的独特制作的面粉
南方的独特制作的芝麻
糖陷月饼

三、UML类图

简单工厂模式
工厂方法模式
抽象工厂模式

四、笔记

面向对象原则

多用组合,少用继承

针对接口编程、不针对实现编程

为交互之间的松耦合设计而努力

类应该对扩展开发、修改关闭《开闭原则》

依赖抽象、不要依赖具体类《依赖倒置原则》

工厂方法模式定义

定义了一个创建对象的接口,但由于之类子类要决定要实例化哪一个。工厂方法让类的实例推迟到子类

抽象工厂模式定义

提供了一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类

注:抽象工厂模式的代码比较复杂,只是做材料的UML类图

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,014评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,796评论 3 386
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,484评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,830评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,946评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,114评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,182评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,927评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,369评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,678评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,832评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,533评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,166评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,885评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,128评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,659评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,738评论 2 351

推荐阅读更多精彩内容

  • 设计模式概述 在学习面向对象七大设计原则时需要注意以下几点:a) 高内聚、低耦合和单一职能的“冲突”实际上,这两者...
    彦帧阅读 3,737评论 0 14
  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,922评论 1 15
  • 文章部分内容转载自:http://blog.csdn.net/zhangerqing 一、设计模式的分类 总体来说...
    j_cong阅读 2,060评论 0 20
  • 文/妖怪来也 蔡郎如见: 自天津一别,已是七月有余,杳无音信。看报纸上与听人们议论,知道你在与老袁作战,戎马倥偬,...
    妖怪来也阅读 2,515评论 77 65
  • 昨日兴许是饮食不当的缘故,自午后便开始腹胀难受,原本以为只是寻常胀气,却没想到整整持续了十几个小时,直到夜半才终于...
    LCAries是巳年呀阅读 216评论 3 0