抽象、封装,具体事情做得越多,越容易犯错误.这每个做过具体工作的人都深有体会,相反,官做得越高,说出的话越抽象越笼统,犯错误可能性就越少.好象我们从编程序中也能悟出人生道理。(百度百科)

不断抽象封装,让复杂事物变得简单,以便于让我们的大脑能够进行处理。

我记得有那么一天,小吴带着女朋友去城西银泰买手机,他们走进一家小米手机店,对卖家(seller)说:“给我一部小米的手机看看?”卖家心里想:“废话,在小米店里,我还能卖苹果手机给你啊!直接说手机呀”

在C语言面向过程下,我们编程就是这样的,必须把每一个过程单独出来,但是在面向对象编程中就可以避免。

1、简单工厂模式:我(客户端)不需要直接创建对象,只需要负责消费。面向对象强调的是开闭原则,对扩展开放,对修改关闭。

当我需要买苹果手机的时候,代码是不需要修改的,当我增加一种新手机类型的时候,部分代码需要改动,需要继承Phone类,工厂要增加逻辑的判断。

综上,当具体产品比较少增加,业务比较简单的时候可以用简单工厂模式。

public class WuSimpleFactory {

public static void main(String[] args) {
//我告诉店员买小米,工厂创建小米手机的实例
Phone phone = Seller.creatPhone("XiaoMi");
//手机根据类型说不同的话
phone.setName("XiaoMi");
phone.sell();
}

}

//抽象产品
abstract class Phone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

//具体产品,根据手机不同,卖家说不同的话
class XiaoMi extends Phone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

class Apple extends Phone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

//简单工厂
class Seller{
public static Phone creatPhone(String phoneType){
Phone phone = null;
if(phoneType.equals("XiaoMi")){
phone = new XiaoMi();
}
if(phoneType.equals("Apple")){
phone = new Apple();
}
return phone;
}
}

2、工厂模式

我们发现简单工厂模式没有完全符合开闭原则,当增加新的具体产品时,需要修改原先的代码,及工厂模块需要增加逻辑,那么我们可以将工厂也抽象出一个抽象工厂。

相当于,不直接找小米或者苹果的店员,先找他们共同的经理,通过经理去管理各个手机店员就好了。

package com.enjoyor.soa.traffic.server.tms.util;

public class WuSimpleFactory {

public static void main(String[] args) {
//我告诉店员买小米,工厂创建小米手机的实例
Seller sell = new XiaoMiSeller();
//手机根据类型说不同的话
Phone phone = sell.creatPhone();
phone.setName("XiaoMi");
phone.sell();
}

}

//抽象产品
abstract class Phone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

//具体产品,根据手机不同,卖家说不同的话
class XiaoMi extends Phone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

class Apple extends Phone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

//工厂
abstract class Seller{
public abstract Phone creatPhone();
}

class XiaoMiSeller extends Seller{
@Override
public Phone creatPhone() {
return new XiaoMi();
}
}

class AppleSeller extends Seller{
@Override
public Phone creatPhone() {
return new Apple();
}}

3、使用工厂模式已经完全符合开闭原则,当增加新的具体产品时不用修改任何原先的代码,只需要分别继承抽象产品类和抽象工厂类即可。基本上能满足大部分的业务需求,但是当手机分型号(产品族)的时候,也就是说,小米手机里面又继续分小米1和小米2的时候,就需要单独定义小米手机的抽象产品里面,用于不同型号的小米手机进行继承。

比如:

//抽象产品
abstract class XiaoMiPhone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

//省略

4、策略模式

策略模式和工厂模式十分类似,只是强调的封装不同。

package com.enjoyor.soa.traffic.server.tms.util;

public class WuSimpleFactory {
//策略模式:内行顾客,知道手机的所有细节,已经将手机实例化了,只是需要工厂处理一下
public static void main(String[] args) {
XiaoMiPhone phone = new XiaoMi1();
phone.setName("mi1");
//传进参数是在客户端已经实例化好的实例
phoneContext context = new phoneContext(phone);
context.sell();

}

}

//抽象产品
abstract class XiaoMiPhone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

//具体产品,根据手机不同,卖家说不同的话
class XiaoMi1 extends XiaoMiPhone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

class XiaoMi2 extends XiaoMiPhone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

//工厂
class phoneContext{
XiaoMiPhone phone = null;
public phoneContext (XiaoMiPhone phone){
this.phone = phone;
}

public void sell(){
this.phone.sell();
}
}

~~~~~~~~~~~~~~~~

package com.enjoyor.soa.traffic.server.tms.util;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class WuSimpleFactory {
//工厂模式:外行顾客,不知道手机具体,只知道一个手机名字
public static void main(String[] args) throws IOException {
System.out.println("请输入你要购买的手机");
String phoneName = new BufferedReader(new InputStreamReader(System.in)).readLine();

XiaoMiPhone phone = phoneContext.creatPhone(phoneName);
phone.setName("mi1");
phone.sell();
}

}

//抽象产品
abstract class XiaoMiPhone{
private String name;

public abstract void sell();

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}
}

//具体产品,根据手机不同,卖家说不同的话
class XiaoMi1 extends XiaoMiPhone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

class XiaoMi2 extends XiaoMiPhone{

@Override
public void sell() {
System.out.println(this.getName() + "类型的手机给你看看");
}
}

//工厂
class phoneContext{
public static XiaoMiPhone creatPhone(String type) {
XiaoMiPhone phone = null;
if("mi1".equalsIgnoreCase(type)){ //不区分大小写
phone = new XiaoMi1();
}
if("mi2".equalsIgnoreCase(type)){
phone = new XiaoMi2();
}
return phone;
}
}

文章参考 : http://www.cnblogs.com/ZSG-DoBestMe/p/5175761.html

工厂模式&策略模式。的更多相关文章

  1. 简单工厂模式&策略模式-简介与区别

    不得不说,这两种模式真的很像. 相似点:都用到了面向对象的继承.多态.抽象,都拥有相似的结构. 不同点:工厂模式仅提供具体的实例对象,怎么使用这个对象是client的自由,策略模式client可以通过 ...

  2. 3.js模式-策略模式

    1. 策略模式 策略模式定义一系列的算法,把它们封装起来,并且可以互相替换. var strategies = { isNonEmpty: function(value,errMsg){ if(val ...

  3. 命令模式 & 策略模式 & 模板方法

    一.策略模式 策略模式:封装易变化的算法,可互相替换. GoF<设计模式>中说道:定义一系列算法,把它们一个个封装起来,并且使它们可以相互替换.该模式使得算法可独立于它们的客户变化. 比如 ...

  4. &lt;大话设计模式&gt;工厂模式,策略模式

    第一章:工厂模式: 通过封装,继承,多态解耦合 业务逻辑和界面逻辑分开 用单独的类创造实例,工厂:创造实例 工厂模式还可以用反射来实现,nsstringFromClass UML类图 聚合表示一众弱的 ...

  5. Go---设计模式(策略模式)

    策略模式定义了算法家族,在调用算法家族的时候不感知算法的变化,客户也不会受到影响. 下面用<大话设计模式>中的一个实例进行改写. 例:超市中经常进行促销活动,促销活动的促销方法就是一个个策 ...

  6. [Python模式]策略模式

    策略模式 定义了算法族,分别封装起来,让它们之间可以互相替换.此模式让算法的变化独立于使用算法的客户. 作为动态语言,Python实现策略模式非常容易,只要所有算法提供相同的函数即可. import ...

  7. java设计模式--行为型模式--策略模式

    策略模式: 策略模式 概述 定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换.本模式使得算法可独立于使用它的客户而变化. 适用性 1.许多相关的类仅仅是行为有异.“策略”提供了一种用多个行 ...

  8. 设计模式之&mdash;&mdash;浅谈strategy模式(策略模式)

    strategy模式,即策略模式.个人觉得吧,策略模式更多的是一种思维方式. 首先我们要知道,为什么需要策略模式.举个例子,比如用程序输出今天下午去玩什么. PlayGame 玩游戏 package ...

  9. [19/05/01-星期三] GOF23_行为型模式(策略模式、模板方法模式)

    一.策略模式(strategy) [策略接口] /*** * "策略"接口 */ package cn.sxt.strategy; public interface Strateg ...

随机推荐

  1. ListCell Animation in ListView

    After a long time I am back again with new stuffs. I have seen that JavaFX has got so many demand no ...

  2. Delphi - XP扫雷外挂制作

    技术交流,DH讲解. 本来之前就在写这个文章,还写了War3挂的教程,后来因为一些事就没有弄了.现在过年在家又没有事就继续把这个写完吧.哈哈.不要以为写个挂很容易,要想写个挂肯定要了解游戏呀.我们现在 ...

  3. jpush 延迟推送的栗子

    这个 推送是上个月做的, 上线之后没有问题,所以,我就把 这个整套代码 整理一哈,方便以后使用. 首先需求是这样的:  在比赛结束后的 10 钟 开始给 参加比赛的球员  发送消息,告诉他们比赛的信息 ...

  4. SQL Server学习之路(八):扩展SQL语句

    0.目录 1.问题描述 2.第一种方法 通过GROUP BY子句解决 3.第二种方法 通过聚合函数解决 4.第三种方法 在select...from...中的from后面嵌套一个表 5.第四种方法 在 ...

  5. 利用AOP实现SqlSugar自动事务

    先看一下效果,带接口层的三层架构: BL层: public class StudentBL : IStudentService { private ILogger mLogger; private r ...

  6. Jquery中attr()与prop()的区别

    在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参数和用法也几乎完全相同.但是,这两个函数的用处却并不相同.下面我们来详细介绍这两个函数之间的区别. 1.操作对象 ...

  7. python爬虫---requests库的用法

    requests是python实现的简单易用的HTTP库,使用起来比urllib简洁很多 因为是第三方库,所以使用前需要cmd安装 pip install requests 安装完成后import一下 ...

  8. pyspider爬取数据存入es--1.安装驱动

    跟使用mysql一样,不安装es驱动的话,也会触发模块找不到的错误 ImportError: No module named elasticsearch 通过pip安装 pip install ela ...

  9. 蓝桥杯之剪格子(经典dfs)

    如下图所示,3 x 3 的格子中填写了一些整数. +--*--+--+ |10* 1|52| +--****--+ |20|30* 1| *******--+ | 1| 2| 3| +--+--+-- ...

  10. netty--NioEventLoop滴干活

    netty是最近项目要用到的nio框架,找了各种资料,发现称赞它的有点多,所以决定用它:其实也就二选一嘛,mina或netty或自己写.对于mina,也不熟,不过看各种介绍,貌似netty干活还是很不 ...