设计模式—三种工厂模式(JAVA)
一:简单工厂:
有一个实际工厂,这个工厂只能造一类的产品,这一类产品就是一个产品接口,会有多个具体产品实现这个接口,例 如,一个手机厂,生产苹果手机,三星手机;
缺点:在工厂类中集中了所有实例的创建逻辑,违反了高内聚责任分配原则,将全部创建逻辑集中到了一个工厂类中;对系统的维护和扩展不利;
使用场景:负责创建的对象比较少;客户只知道传入工厂类的参数,对于如何创建对象的逻辑不关心;容易违反高内聚责任分配原则,所以只在很简单的情况下应用;
package com.designPattern.simpleFactory;
public interface Shape { // 产品接口
public String toString();
}
package com.designPattern.simpleFactory;
public class ShapeA implements Shape { // 具体产品
@Override
public String toString()
{
return "shape A";
}
}
package com.designPattern.simpleFactory;
public class ShapeB implements Shape { // 具体产品
@Override
public String toString()
{
return "shape B";
}
}
package com.designPattern.simpleFactory;
public class ShapeFactory {
public static Shape createShape(String shapeStr)
{
switch(shapeStr)
{
case "ShapeA": return new ShapeA();
case "ShapeB": return new ShapeB();
}
return null;
}
public static void main(String[] args)
{
Shape A = ShapeFactory.createShape("ShapeA");
Shape B = ShapeFactory.createShape("ShapeB");
System.out.println(A);
System.out.println(B);
}
}
二:工厂方法:
比简单工厂高级一点了,一个工厂的接口,多个工厂实现这个工厂接口,一个产品接口,多个具体产品实现这个产品接口,例如,一个手机厂接口,有苹果手机厂,三星手机厂两个具体工厂,苹果手机厂生产苹果手机,三星手机厂生产三星手机;可以在不修改具体工厂角色的情况下引用新的产品,一个抽象工厂对应一个抽象产品,一个具体工厂对应一个具体产品。
使用场景:对于某个产品,调用者清楚知道应该使用哪个具体工厂服务,实例化该具体工厂,生产出具体的产品来;
package com.designPattern.factoryMethod;
public interface Car { // 产品接口
void gotowork();
}
package com.designPattern.factoryMethod;
public interface ICarFactory { // 生产产品的类厂接口
Car getCar();
}
package com.designPattern.factoryMethod;
public class Bike implements Car { // 具体产品
@Override
public void gotowork() {
// TODO Auto-generated method stub
}
}
package com.designPattern.factoryMethod;
public class Bus implements Car { // 具体产品
@Override
public void gotowork() {
}
}
package com.designPattern.factoryMethod;
public class BikeFactory implements ICarFactory { // 具体产品工厂
@Override
public Car getCar() {
// TODO Auto-generated method stub
return null;
}
}
package com.designPattern.factoryMethod;
public class BusFactory implements ICarFactory { // 具体产品工厂
@Override
public Car getCar() {
return null;
}
}
package com.designPattern.factoryMethod;
public class TestFactory {
public static void main(String[] args)
{
ICarFactory factory = null;
factory = new BikeFactory();
Car bike = factory.getCar();
bike.gotowork();
factory = new BusFactory();
Car bus = factory.getCar();
bus.gotowork();
}
}
三:抽象工厂:
前两种工厂,说到底都只能生产一类产品(都是手机),抽象工厂支持多种类型的产品。一个工厂接口,多个 具体工厂,多个产品接口,多个具体产品,例如,电器厂接口,有三星厂和苹果厂两个具体工厂,三星厂生产三星手机, 三星电脑,苹果厂生产苹果手机,苹果电脑。户端在不必指定产品的具体情况下,创建多个产品族中的产品对象。
package com.designPattern.abstractFactory;
public interface AbstractFactory { // 抽象工厂
public ProductA factoryA();
public ProductB factoryB();
}
package com.designPattern.abstractFactory;
public class ConcreateFacotry1 implements AbstractFactory { //具体工厂
@Override
public ProductA factoryA() {
return new ConcreateProductA1();
}
@Override
public ProductB factoryB() {
return new ConcreateProductB1();
}
}
package com.designPattern.abstractFactory;
public class ConcreateFactory2 implements AbstractFactory { //具体工厂
@Override
public ProductA factoryA() {
return new ConcreateProductA2();
}
@Override
public ProductB factoryB() {
// TODO Auto-generated method stub
return new ConcreateProductB2();
}
}
package com.designPattern.abstractFactory;
public interface ProductA { // 抽象产品
public void method1();
public void method2();
}
package com.designPattern.abstractFactory;
public interface ProductB { // // 抽象产品
public void method1();
public void method2();
}
package com.designPattern.abstractFactory;
public class ConcreateProductA1 implements ProductA { // 具体产品
@Override
public void method1() {
System.out.println("等级为1的A的method1");
}
@Override
public void method2() {
System.out.println("等级为1的A的method2");
}
}
package com.designPattern.abstractFactory;
public class ConcreateProductA2 implements ProductA { // 具体产品
@Override
public void method1() {
System.out.println("等级为2的A的method1");
}
@Override
public void method2() {
System.out.println("等级为2的A的method2");
}
}
package com.designPattern.abstractFactory;
public class ConcreateProductB1 implements ProductB { // 具体产品
@Override
public void method1() {
System.out.println("等级为1的B的method1");
}
@Override
public void method2() {
System.out.println("等级为1的B的method2");
}
}
package com.designPattern.abstractFactory;
public class ConcreateProductB2 implements ProductB { // 具体产品
@Override
public void method1() {
System.out.println("等级为2的产品B的method1()");
}
@Override
public void method2() {
System.out.println("等级为2的产品B的method2()");
}
}
package com.designPattern.abstractFactory;
public class test {
public static void main(String[] args) {
AbstractFactory ff = new ConcreateFacotry1();
ProductA aa = ff.factoryA();
ProductB bb = ff.factoryB();
aa.method1();
aa.method2();
bb.method1();
bb.method2();
AbstractFactory f2 = new ConcreateFactory2();
aa = f2.factoryA();
bb = f2.factoryB();
aa.method1();
aa.method2();
bb.method1();
bb.method2();
}
}
设计模式—三种工厂模式(JAVA)的更多相关文章
- java设计模式---三种工厂模式之间的区别
简单工厂,工厂方法,抽象工厂都属于设计模式中的创建型模式.其主要功能都是帮助我们把对象的实例化部分抽取了出来,优化了系统的架构,并且增强了系统的扩展性. 本文是本人对这三种模式学习后的一个小结以及对他 ...
- java设计模式三种工厂模式简单介绍
一.简单工厂模式 概述:简单工厂模式的创建意图就是,把对类的创建初始化全都交给一个工厂来执行,而用户不需要去关心创建的过程是什么样的,只用告诉工厂我想要什么就行了.而这种方法的缺点也很明显,违背了设计 ...
- java设计模式---三种工厂模式
工厂模式提供创建对象的接口. 工厂模式分为三类:简单工厂模式(Simple Factory), 工厂方法模式(Factory Method)和抽象工厂模式(Abstract Factory).GOF在 ...
- 三种工厂模式的分析以及C++实现
三种工厂模式的分析以及C++实现 以下是我自己学习设计模式的思考总结. 简单工厂模式 简单工厂模式是工厂模式中最简单的一种,他可以用比较简单的方式隐藏创建对象的细节,一般只需要告诉工厂类所需要的类型, ...
- java三种工厂模式
适用场合: 7.3 工厂模式的适用场合 创建新对象最简单的办法是使用new关键字和具体类.只有在某些场合下,创建和维护对象工厂所带来的额外复杂性才是物有所值.本节概括了这些场合. 7.3.1 动态实现 ...
- java 三种工厂模式
一.简单工厂模式 一个栗子: 我喜欢吃面条,抽象一个面条基类,(接口也可以),这是产品的抽象类. public abstract class INoodles { /** * 描述每种面条啥样的 */ ...
- 深入理解Java的三种工厂模式
一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 public interface Car { S ...
- Java的三种工厂模式
一.简单工厂模式 简单工厂的定义:提供一个创建对象实例的功能,而无须关心其具体实现.被创建实例的类型可以是接口.抽象类,也可以是具体的类 实现汽车接口 //产品接口 //汽车需要满足一定的标准 pub ...
- Java设计模式之三种工厂模式
工厂模式实现了创建者和调用者的分离,实现了更好的解耦. 详细分类: 1) 简单工厂模式(静态工厂模式): 2) 工厂方法模式: 3) 抽象工厂模式 面向对象设计的基本原则: 1) OC ...
随机推荐
- Python程序员不完全指南
Python 基础 Python基础 基础数据类型 深浅copy 文件操作 函数 初识函数 函数进阶 装饰器函数 迭代器和生成器 各种推导式 递归函数 内置函数和匿名函数 异常处理 常用模块 模块和包 ...
- [置顶]
针对 CoordinatorLayout 及 Behavior 的一次细节较真
我认真不是为了输赢,我就是认真.– 罗永浩 我一直对 Material Design 很感兴趣,每次在官网上阅读它的相关文档时,我总会有更进一步的体会.当然,Material Design 并不是仅仅 ...
- Android中免root的hook框架Legend原理解析
一.前言 Android中hook框架已经非常多了,最优秀的当属Xposed和Substrate了,这两个框架我在之前的文章都详细介绍过了,不了解的同学,可以转战这里:http://www.wjdia ...
- [置顶]
Isolation Forest算法实现详解
本文算法完整实现源码已开源至本人的GitHub(如果对你有帮助,请给一个 star ),参看其中的 iforest 包下的 IForest 和 ITree 两个类: https://github.co ...
- iOS开发之如何在Xcode中显示断点堆栈
昨天有人问我在Xcode中打断点后怎么查看堆栈,今天就简单的聊聊. 首先解释一下,什么是堆栈? 堆:顺序随意:栈区(stack)- 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等.其操作方式 ...
- Xcode5.1.1支持低版本和image not found和Couldn't register XXXX with the bootstrap server. Error: unknown error code.
一:问题 targets中证书的设置 1.项目支持多设备(Xcode5.1.1支持低版本) 2.真机测试要确保Code Siging 设置没问题 支持的最低版本 二 :问题:image not f ...
- 機器學習基石 机器学习基石(Machine Learning Foundations) 作业1 习题解答 (续)
这里写的是 习题1 中的 18 , 19, 20 题的解答. Packet 方法,我这里是这样认为的,它所指的贪心算法是不管权重更新是否会对train data有改进都进行修正,因为这里面没有 ...
- learn go recursive
package main // 参考文章: // https://github.com/Unknwon/the-way-to-go_ZH_CN/blob/master/eBook/06.6.md im ...
- 【C++】STL之队列queue
1.头文件 # include<queue> 2.成员函数 empty() 当队列为空时,返回true size() 返回队列内元素个数 front() 返回队首元素 back() 返回队 ...
- windows主机与virtualbox虚拟机下的Linux共享网络
环境: 主机:windows7 虚拟机:virtualbox 4.2 虚拟系统:CentOS6.2 需求: 1.虚拟机linux可以共享主机网络上互联网 2.主机.虚拟机互通讯,组成一个虚拟的局域网, ...