设计模式 (二) 工厂模式

工厂模式:属于创建型模式,它提供了一种创建对象的最佳方式。
在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象。

主要解决接口选择的问题

一个工厂可以生产带有各种颜色的各种形状:
首先由颜色接口和形状接口:

//图像接口
public interface Shape {
 enum Type {
        Circle, Rectangle, Square
    }
    String Name();
    void Draw();
}

//颜色接口
public interface Colour {
    void Upper();
}

下面有实体类有圆形,三角形,正方形

//圆形
public class Circle implements Shape {


    @Override
    public String Name() {
        return "Circle";
    }

    @Override
    public void Draw() {

        Log.e("Shape", "--------------" + Name() + "------------");
    }
}

//正方形
public class Square implements Shape {

    @Override
    public void Draw() {

        Log.e("Shape", "--------------" + Name() + "------------");
    }

    @Override
    public String Name() {
        return "Square";
    }
}

//三角形
public class Rectangle implements Shape {

    @Override
    public String Name() {
        return "Rectangle";
    }

    @Override
    public void Draw() {

        Log.e("Shape", "--------------" + Name() + "------------");
    }
}

颜色实体类:

//灰色
public class Gray implements Colour {


    @Override
    public void Upper() {
        Log.e("Colour","--------- Colour is Gray ---------");
    }
}

//红色
public class Red implements Colour {


    @Override
    public void Upper() {
        Log.e("Colour","--------- Colour is Red---------");
    }
}

//绿色
public class Green implements Colour {


    @Override
    public void Upper() {
        Log.e("Colour","--------- Colour is Green---------");
    }
}

下面是我们的工厂,我们的形状工厂(标准工厂模式的实现):

public class ShapeFactory {

   public Shape getShape(Shape.Type type) {

        if (type == Shape.Type.Circle) {

            return new Circle();
        } else if (type == Shape.Type.Rectangle) {
            return new Rectangle();
        } else {
            return new Square();
        }

    }
}

我们还可以这样用(偏抽象工厂的实现)



public class Factory {

    private Shape shape = null;
    private Colour colour = null;

    public Factory(Shape shape, Colour colour) {
        this.shape = shape;
        this.colour = colour;
    }

    public Shape getShape() {
        return shape;
    }


    public Colour getColour() {
        return colour;
    }

    public void showThis() {
        getShape().Draw();
        getColour().Upper();
    }
}

如何使用:

        Factory shapeFactory = new Factory();
        Shape  sq=shapeFactory.getShape(Shape.Type.Square);
        Shape  cc=shapeFactory.getShape(Shape.Type.Circle);
        Shape  rt=shapeFactory.getShape(Shape.Type.Rectangle);

或者

 private Factory ff = new Factory(new Rectangle(),new Green());
 ff.showThis();

抽象工厂模式Kotlin 实现:
接口

interface ktShape {
    fun getName(): String
    fun Draw()

}

enum class ShapeType {
    Circle, Rectangle, Square

}

enum class ColorType {
    Bule, Red, Wite

}

interface ktColor {
    fun getName(): String
    fun Upper()
}

interface ShapeFactory {
    fun MakeShape(type: ShapeType): ktShape
}

interface ColorFactory {

    fun MakeColor(type: ColorType): ktColor
}

颜色类,实现:

class RedC : ktColor {
    override fun getName(): String {
        return "Red Color"
    }

    override fun Upper() {
        System.out.print(getName())
    }

}

class BuleC : ktColor {
    override fun getName(): String {
        return "Bule Color"
    }

    override fun Upper() {
        System.out.print(getName())
    }

}

class WiteC : ktColor {
    override fun getName(): String {
        return "Wite Color"
    }

    override fun Upper() {
        System.out.print(getName())
    }

}

形状类


class Squarekt : ktShape {
    override fun getName(): String {
        return "Square  Shape"
    }

    override fun Draw() {
        System.out.print(getName())
    }

}

class Circlekt : ktShape {
    override fun getName(): String {
        return "Circle  Shape"
    }

    override fun Draw() {
        System.out.print(getName())
    }

}

class Rectanglekt : ktShape {
    override fun getName(): String {
        return "Rectangle  Shape"
    }

    override fun Draw() {
        System.out.print(getName())
    }

}

工厂类:

class AbsFactory : ShapeFactory, ColorFactory {

    var ktsp: ktShape? = null
    var ktco: ktColor? = null

    constructor ()
    override fun MakeShape(type: ShapeType): ktShape {

        when (type) {
            ShapeType.Circle -> ktsp = Circlekt()
            ShapeType.Rectangle -> ktsp = Rectanglekt()
            ShapeType.Square -> ktsp = Squarekt()

        }
        return ktsp as ktShape

    }

    override fun MakeColor(type: ColorType): ktColor {
        when (type) {
            ColorType.Red -> ktco = RedC()
            ColorType.Bule -> ktco = BuleC()
            ColorType.Wite -> ktco = WiteC()
        }

        return ktco as ktColor

    }
}

如何使用:

class main {
    var absF: AbsFactory = AbsFactory()

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

推荐阅读更多精彩内容

  • 设计模式汇总 一、基础知识 1. 设计模式概述 定义:设计模式(Design Pattern)是一套被反复使用、多...
    MinoyJet阅读 3,894评论 1 15
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,560评论 18 399
  • 1 场景问题# 1.1 导出数据的应用框架## 考虑这样一个实际应用:实现一个导出数据的应用框架,来让客户选择数据...
    七寸知架构阅读 6,476评论 6 72
  • 坐在职业车手陈锦荣的车上,并没有一种速激的血脉亢张感,因为开得不急不慢,谨守交规。此行又不是去深圳车窗踢馆,更不是...
    爱笑先生阅读 434评论 0 0
  • 想写些什么,却又不知道想写些什么。大学毕业已经一年多了。说不上提笔忘字,但是也着实对那些年朝夕相处的文字纸笔生分了...
    帅气的爸阅读 194评论 0 0